7.6. 配置自定义合并策略
在处理网络分区时,将 Data Grid 配置为使用 EntryMergePolicy
API 的自定义实现。
先决条件
实现
EntryMergePolicy
API。public class CustomMergePolicy implements EntryMergePolicy<String, String> { @Override public CacheEntry<String, String> merge(CacheEntry<String, String> preferredEntry, List<CacheEntry<String, String>> otherEntries) { // Decide which entry resolves the conflict return the_solved_CacheEntry; }
流程
如果使用远程缓存,请将合并策略实施部署到 Data Grid 服务器。
将您的类打包为 JAR 文件,其中包含
META-INF/services/org.infinispan.conflict.EntryMergePolicy
文件,其中包含合并策略的完全限定域名。# List implementations of EntryMergePolicy with the full qualified class name org.example.CustomMergePolicy
将 JAR 文件添加到
server/lib
目录。提示使用带有 Data Grid 命令行界面(CLI)的
install
命令,将 JAR 下载到server/lib
目录。
- 打开 Data Grid 配置以进行编辑。
根据情况,使用
encoding
元素或encoding ()
方法配置缓存编码。对于远程缓存,如果您只使用对象元数据在合并条目时进行比较,您可以使用
application/x-protostream
作为介质类型。在这种情况下,Data Grid 将条目返回到EntryMergePolicy
作为byte[]
。如果您需要合并冲突时对象本身,您应该使用
application/x-java-object
介质类型配置缓存。在这种情况下,您必须将相关的 ProtoStream marshallers 部署到 Data Grid Server,以便在客户端使用 Protobuf 编码时执行byte[]
到对象转换。-
使用
merge-policy
属性或mergePolicy ()
方法指定自定义合并策略,作为分区处理配置的一部分。 - 保存您的更改。
自定义合并策略配置
XML
<distributed-cache name="mycache"> <partition-handling when-split="DENY_READ_WRITES" merge-policy="org.example.CustomMergePolicy"/> </distributed-cache>
JSON
{ "distributed-cache": { "partition-handling" : { "when-split": "DENY_READ_WRITES", "merge-policy": "org.example.CustomMergePolicy" } } }
YAML
distributedCache: partitionHandling: whenSplit: DENY_READ_WRITES mergePolicy: org.example.CustomMergePolicy
ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.clustering().cacheMode(CacheMode.DIST_SYNC) .partitionHandling() .whenSplit(PartitionHandling.DENY_READ_WRITES) .mergePolicy(new CustomMergePolicy());