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 Server。
将您的类打包为 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 配置进行编辑。
根据具体情况,使用编码元素或
encoding
()对于远程缓存,如果您只使用对象元数据在合并条目时进行比较,您可以使用
application/x-protostream
作为介质类型。在这种情况下,Data Grid 会将条目返回到EntryMergePolicy
,存为byte[]
。如果您在合并冲突时要求对象本身,则您应该使用
application/x-java-object
介质类型配置缓存。在这种情况下,您必须将相关的 ProtoStream marshallers 部署到 Data Grid 服务器,以便在客户端使用 Protobuf 编码时,它就可以对对象执行字节[]
。-
使用
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());