在Coherence中,您可以使用PartitionedService
查找緩存鍵與羣集成員的關聯。然後,您可以使用PartitionedFilter
來爲每個成員調用輸入處理器的數據,以確保數據僅發送給該成員。事情是這樣的:
// keys in this map are also keys in cache
void processData(Map<String, Data> externalData) {
PartitionedService partitionedService = (PartitionedService) cache.getCacheService();
Map<Member, Map<String, Data>> dataForMembers = splitDataByMembers(partitionedService, externalData);
for (Entry<Member, Map<String, Data>> dataForMember : dataForMembers.entrySet()) {
Member member = dataForMember.getKey();
Map<String, Data> data = dataForMember.getValue();
PartitionSet partitions = partitionedService.getOwnedPartitions(member);
PartitionedFilter filter = new PartitionedFilter<>(Filters.always(), partitions);
EntryProcessor processor = new MyEntryProcessor(data);
cache.async().invokeAll(filter, processor);
}
}
Map<Member, Map<String, Data>> splitDataByMembers(
PartitionedService partitionedService,
Map<String, Data> externalData) {
Map<Member, Map<String, Data>> dataForMembers = new HashMap<>();
for (Object member : partitionedService.getInfo().getServiceMembers()) {
dataForMembers.put((Member) member, new HashMap<>());
}
for (Entry<String, Data> dataForKey : externalData.entrySet()) {
Member member = partitionedService.getKeyOwner(dataForKey.getKey());
dataForMembers.get(member).put(dataForKey.getKey(), dataForKey.getValue());
}
return dataForMembers;
}
這樣只會有一個在羣集中的每個成員條目處理器調用和每個成員將得到它感興趣的只是數據
我以前String
作爲緩存鍵,任意Data
鍵入與此鍵關聯的數據,但您當然可以使用任何其他類型(並且您不必將外部數據建模爲映射)。
這。我來這裏寫同樣的建議.'IExecutorService.submitToKeyOwner(Callable/Runnable,key)'可以用於簡單的解決方案。 –
謝謝!這是我認爲可能是最好的。 – Patrick
您能否提供一些示例代碼? –