Caching 如何在所有节点上并发执行GridCache.forEach()并进行分区?

Caching 如何在所有节点上并发执行GridCache.forEach()并进行分区?,caching,gridgain,Caching,Gridgain,try(Grid Grid=GridGain.start(answeryagofcattests.class.getResource(“yago.GridGain.xml”)){ GridCache=grid.cache(“yagoRules”); grid.compute().broadcast(新的Runnable()){ @凌驾 公开募捐{ 试一试{ info(“缓存以前的大小为{}offheap={}溢出={}”, cache.size()、cache.offheapentriescon

try(Grid Grid=GridGain.start(answeryagofcattests.class.getResource(“yago.GridGain.xml”)){
GridCache=grid.cache(“yagoRules”);
grid.compute().broadcast(新的Runnable()){
@凌驾
公开募捐{
试一试{
info(“缓存以前的大小为{}offheap={}溢出={}”,
cache.size()、cache.offheapentriescont()、cache.overflowSize());
}捕获(网格异常){
log.error(“无法获取溢出大小”,e);
}
}
}).get();
log.info(“1是{}”,cache.get(1));
grid.compute().apply(新的GridClosure()){
@凌驾
公共字符串应用(字符串e){
log.info(“找到{}YAGO规则”,cache.size());
cache.forEach(新的GridInClosure(){
@凌驾
公共作废申请(GridCache条目){
info(“处理规则{}{}”,e.getKey(),e.getValue());
}
});
返回null;
}
},msg);
}
在3节点配置中。GridGain选择一个节点(似乎是随机的),然后仅处理该节点中的每个“处理规则”


我想做的是使forEach并行,因此理想情况下,对于3个节点和30个条目,每个节点应该处理10个条目。缓存是
分区的
,因此每个节点都有自己的条目。

在代码中,而不是
grid.compute().apply(…)
尝试使用
grid.compute().broadcast(…)
将闭包广播到网格中的所有节点

另外,如果您只需要遍历主集合(不包括备份),可以按以下方式执行:

grid.compute().broadcast(new GridClosure<String, Integer>() {
    @Override public String apply(String e) {
        for (GridCacheEntry<Integer, YagoRule> e : cache.primaryEntrySet()
            log.info("Processing rule #{} {}", e.getKey(), e.getValue());
    }
}, msg).get();
grid.compute().broadcast(新的GridClosure()){
@覆盖公共字符串应用(字符串e){
for(GridCacheEntry e:cache.primaryEntrySet()的)
info(“处理规则{}{}”,e.getKey(),e.getValue());
}
},msg);

这不会像预期的那样工作,因为会有重复项。例如,node1包含A、B、C,node2包含B、C、D。我希望这4个条目都能得到处理(不管是谁做的)。@HendyIrawan听起来你需要使用“primaryEntrySet()”方法。我在回答中更新了示例。
grid.compute().broadcast(new GridClosure<String, Integer>() {
    @Override public String apply(String e) {
        for (GridCacheEntry<Integer, YagoRule> e : cache.primaryEntrySet()
            log.info("Processing rule #{} {}", e.getKey(), e.getValue());
    }
}, msg).get();