【发布时间】:2015-07-02 22:51:54
【问题描述】:
我想设置一个缓存加载策略,以便 infinispan 缓存中的内容来自 *.dat(由 infinispan 本身创建的)或人类可读的 txt 文件(通过手动导出缓存条目创建)基于系统属性。
如何以编程方式调用 infinispan 缓存加载器以从 *.dat 文件加载?我可以解析 txt 文件并从中加载缓存,但不知道如何使用 dat 文件作为种子缓存。
【问题讨论】:
标签: java caching infinispan
我想设置一个缓存加载策略,以便 infinispan 缓存中的内容来自 *.dat(由 infinispan 本身创建的)或人类可读的 txt 文件(通过手动导出缓存条目创建)基于系统属性。
如何以编程方式调用 infinispan 缓存加载器以从 *.dat 文件加载?我可以解析 txt 文件并从中加载缓存,但不知道如何使用 dat 文件作为种子缓存。
【问题讨论】:
标签: java caching infinispan
缓存加载器/写入器是在启动时创建的,无法即时添加它。但是,您可以:
a) 创建新的缓存并将缓存加载器放入编程配置中;那么你只需调用cache.entrySet() 甚至更好的cache.getAdvancedCache().filterEntries() 并读取缓存内容,包括存储中的数据,并将它们提供给目标缓存。您可能应该在加载过程中以某种方式清除缓存,以免文件太大时耗尽内存。
b) 只创建缓存加载器类本身 (SingleFileStore) 并调用 process() 来读取所有条目。您可以找到一个如何在测试套件中实例化它的示例。
c) 看代码看格式——其实很简单,文件开头4个magic字节,入口大小(4字节),键长(4字节),数据长度(4字节),标头中的元数据长度(4 个字节)和过期时间戳(8 个字节),然后是密钥、数据和元数据。使用VersionAwareMarshaller 将对象编组为字节并返回。
【讨论】:
@Flavius 是绝对正确的。缓存写入器和加载器在启动期间被实例化。
您可以考虑实现自己的自定义缓存加载器并将其部署在 Hotrod 服务器上。最简单的方法是使用this archetype。 Here你可能会找到实现细节。
【讨论】: