ApacheIgniteDataStreamer如何将数据设置为ignitefuture?

ApacheIgniteDataStreamer如何将数据设置为ignitefuture?,future,ignite,data-stream,Future,Ignite,Data Stream,我正在ApacheIgnite中创建一个批处理数据流,需要控制数据接收后发生的事情。 我的批次具有以下结构: public class Batch implements Binarylizable, Serializable { private String eventKey; private byte[] bytes; etc.. 然后我尝试流式传输我的数据: try (IgniteDataStreamer<Integer, Batch> strea

我正在ApacheIgnite中创建一个批处理数据流,需要控制数据接收后发生的事情。 我的批次具有以下结构:

public class Batch implements Binarylizable, Serializable {

    private String eventKey;
    private byte[] bytes;

    etc..
然后我尝试流式传输我的数据:

 try (IgniteDataStreamer<Integer, Batch> streamer = serviceGrid.getIgnite().dataStreamer(cacheName);
             StreamBatcher batcher = StreamBatcherFactory.create(event) ){
            streamer.receiver(StreamTransformer.from(new BatchDataProcessor(event)));
            streamer.autoFlushFrequency(1000);
            streamer.allowOverwrite(true);
            statusService.updateStatus(event.getKey(), StatusType.EXECUTING);
            int counter = 0;
            Batch batch = null;
            IgniteFuture<?> future = null;
            while ((batch = batcher.batch()) != null) {
                future = streamer.addData(counter++, batch);
            }
            Object getted = future.get();
try(IgniteDataStreamer streamer=serviceGrid.getIgnite().dataStreamer(cacheName);
StreamBatcher batcher=StreamBatcherFactory.create(事件)){
拖缆接收器(StreamTransformer.from(新的BatchDataProcessor(事件));
拖缆自动冲洗频率(1000);
拖缆。允许超写(真);
statusService.updateStatus(event.getKey(),StatusType.EXECUTING);
int计数器=0;
批次=空;
IgniteFuture=null;
而((batch=batcher.batch())!=null){
future=streamer.addData(计数器++,批处理);
}
Object getted=future.get();
仅供测试使用,让我们只获取最后一个未来,并尝试分析此对象。在上面的代码中,我使用的是BatchDataProcessor,如下所示:

public class BatchDataProcessor implements CacheEntryProcessor<Integer, Batch, Object> {

    private final Event event;
    private final String eventKey;

    public BatchDataProcessor(Event event) {
        this.event = event;
        this.eventKey = event.getKey();
    }

    @Override
    public Object process(MutableEntry<Integer, Batch> mutableEntry, Object... objects) throws EntryProcessorException {
        Node node = NodeIgniter.node(Ignition.localIgnite().cluster().localNode().id());
        ServiceGridContainer container = (ServiceGridContainer) node.getEnvironmentContainer().getContainerObject(ServiceGridContainer.class);
        ProcessMarshaller marshaller = (ProcessMarshaller) container.getService(ProcessMarshaller.class);
        LocalProcess localProcess = marshaller.intoProccessing(event.getLambdaExecutionKey());
        try {
            localProcess.addBatch(mutableEntry);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            return new String("111");
        }
    }
}
公共类BatchDataProcessor实现CacheEntryProcessor{
私人决赛;
私有最终字符串eventKey;
公共BatchDataProcessor(事件){
this.event=事件;
this.eventKey=event.getKey();
}
@凌驾
公共对象进程(MutableEntry MutableEntry,Object…objects)抛出EntryProcessorException{
Node Node=NodeIgniter.Node(点火.localIgnite().cluster().localNode().id());
ServiceGridContainer=(ServiceGridContainer)节点.getEnvironmentContainer().getContainerObject(ServiceGridContainer.class);
ProcessMarshaller=(ProcessMarshaller)container.getService(ProcessMarshaller.class);
LocalProcess LocalProcess=marshaller.intoProcessing(event.getLambdaExecutionKey());
试一试{
addBatch(mutableEntry);
}捕获(IOE异常){
e、 printStackTrace();
}最后{
返回新字符串(“111”);
}
}
}
因此,在localProcess.addBatch(mutableEntry)之后,我想发回一个关于这个特定批处理状态的信息,所以我认为我应该在IgniteFuture对象中这样做,但是我没有找到如何控制addData函数中接收的future对象的任何信息


任何人都可以帮助理解,我在哪里可以控制接收addData函数的未来,或者以其他方式实现对流式批处理的回调?

当您执行
StreamTransformer时。从()
,您将失去
批处理程序的结果,因为

for (Map.Entry<K, V> entry : entries)
    cache.invoke(entry.getKey(), this, entry.getValue());
//  ^ result of cache.invoke() is discarded here
for(Map.Entry:entries)
invoke(entry.getKey(),this,entry.getValue());
//^cache.invoke()的结果在此被丢弃
DataStreamer
用于单向数据流。据我所知,它不应该返回值

如果依赖于
cache.invoke()
的结果,我建议直接调用它,而不是依赖于
DataStreamer


顺便说一句,小心使用
fut.get()
。您应该先执行
dataStreamer.flush()
,否则
dataStreamer
的未来将无限期等待。

当您执行
StreamTransformer.from()
时,您将失去
批处理程序的结果,因为

for (Map.Entry<K, V> entry : entries)
    cache.invoke(entry.getKey(), this, entry.getValue());
//  ^ result of cache.invoke() is discarded here
for(Map.Entry:entries)
invoke(entry.getKey(),this,entry.getValue());
//^cache.invoke()的结果在此被丢弃
DataStreamer
用于单向数据流。据我所知,它不应该返回值

如果依赖于
cache.invoke()
的结果,我建议直接调用它,而不是依赖于
DataStreamer

顺便说一句,小心使用
fut.get()
。您应该先执行
dataStreamer.flush()
,否则
dataStreamer的未来将无限期等待