Ignite StreamTransformer是否安全?

Ignite StreamTransformer是否安全?,ignite,Ignite,假设我有一个具有多个节点的ignite集群和一个名为“TEST_CACHE”的分区非空ignite缓存。然后,我在其中一个节点中运行以下代码: ignite.compute().run(new IgniteRunnable(){ @IgniteInstanceResource private Ignite ignite; @Override public void run() { IgniteDataStreamer<String,Long

假设我有一个具有多个节点的ignite集群和一个名为“TEST_CACHE”的分区非空ignite缓存。然后,我在其中一个节点中运行以下代码:

ignite.compute().run(new IgniteRunnable(){
    @IgniteInstanceResource
    private Ignite ignite;

    @Override
    public void run() {
        IgniteDataStreamer<String,Long> ds = ignite.dataStreamer("TEST_CACHE");
        ds.receiver(new StreamTransformer<String,Long>(){
            @Override
            public Object process(MutableEntry<String, Long> entry, Object... arguments)
                    throws EntryProcessorException {
                Long value = entry.getValue();
                entry.setValue(value==null?1L:(value.longValue()+1L));
                return null;
            }
        });

        //loop for adding lots of String data
        while(...)
            ds.addData(...);
    }

});
ignite.compute().run(新的IgniteRunnable()){
@点火源
私人点火;
@凌驾
公开募捐{
IgniteDataStreamer ds=ignite.dataStreamer(“测试缓存”);
ds.接收器(新StreamTransformer(){
@凌驾
公共对象进程(可变项、对象…参数)
抛出EntryProcessorException{
Long value=entry.getValue();
entry.setValue(value==null?1L:(value.longValue()+1L));
返回null;
}
});
//用于添加大量字符串数据的循环
而(…)
ds.addData(…);
}
});

这类似于官方的StreamTransformerExample代码,但不同的是每个节点将获得同一缓存的DataStreamer实例,并同时调用addData方法。换句话说,对于不同节点中的相同字符串数据,可能一个节点刚刚通过“Long value=entry.getValue()”获取了值,但没有执行下一行代码来设置值并更新到缓存中,然后另一个节点正在执行“entry.getValue()”。因此,是否可能在此并发StreamTransformer用例中更新错误的值?

使用条目处理器的StreamReceiver.receive calls cache.invoke,因此条目在此操作中被锁定。所以是的,它是安全的


顺便说一句,您在数据流中启用了allowOverwrite吗?

谢谢您的回答。我没有启用allowOverwrite。allowOverwrite是否会影响并发安全?它不会,但是:“默认情况下,数据流不会覆盖现有数据,这意味着如果遇到缓存中已有的条目,它将跳过它”。好的,我明白了。我只想将DataStreamer.receiver用作实现组,因为您也可以将其用作map reduce计算