使用IgniteDataStreamerAPI的正确方法

使用IgniteDataStreamerAPI的正确方法,ignite,Ignite,我有一个多线程应用程序,它使用write()方法不断写入以点燃缓存。在启动时,它调用init()方法,该方法创建缓存和拖缆对象。完成所有线程后,将调用flush(),关闭拖缆并在write()方法中写入任何未能插入的密钥。我有一些疑问 在write()方法中,我应该如何处理它?我应该等到它完成吗 当条目写入缓存或拖缆内部缓冲区时,是否完成此操作 在flush()方法中,我在关闭streamer对象之前写入write()方法中失败的所有条目。这是正确的方法吗? 代码如下: public void

我有一个多线程应用程序,它使用write()方法不断写入以点燃缓存。在启动时,它调用init()方法,该方法创建缓存和拖缆对象。完成所有线程后,将调用flush(),关闭拖缆并在write()方法中写入任何未能插入的密钥。我有一些疑问

  • 在write()方法中,我应该如何处理它?我应该等到它完成吗

  • 当条目写入缓存或拖缆内部缓冲区时,是否完成此操作

  • 在flush()方法中,我在关闭streamer对象之前写入write()方法中失败的所有条目。这是正确的方法吗? 代码如下:

    public void initialize(final String cacheName) {
      getOrCreateCache(cacheName, true); // create new cache or get existing if it already exists
      this.streamer = ignite.dataStreamer(cacheName);
      this.cacheName = cacheName;
    }
    
    public void write(K key, V value) {
    try {
      IgniteFuture<?> future = streamer.addData(key, value); // what to do with this future. Should i wait on that?
      numberOfEntriesWrittentIntoCache.incrementAndGet();
     } catch (IgniteInterruptedException | IgniteDataStreamerTimeoutException | CacheException | IllegalStateException e) {
       failedMap.put(key, value);
     }
    }
    
    public void flush() {
    try {
      if (streamer != null) {
        if (failedMap.size() > 0) {
          LOGGER.info("Writing " + failedMap.size() + " failed entries");
          failedMap.forEach((k, v) -> writeToGrid(k, v));
        }
      }
    } catch (IllegalStateException | CacheException | IgniteException e) {
      LOGGER.error("Exception while writing/closing ignite");
    } catch (Exception e) {
      LOGGER.error("Exception while writing/closing ignite");
    } finally {
      failedMap.clear();
      if (streamer != null) {
        streamer.close();
        streamer = null;
      }
      LOGGER.info("Number of entries written into cache are " + numberOfEntriesWrittentIntoCache.intValue());
    }
    
    public void初始化(最终字符串cacheName){
    getOrCreateCache(cacheName,true);//创建新缓存或获取现有缓存(如果已存在)
    this.streamer=ignite.dataStreamer(cacheName);
    this.cacheName=cacheName;
    }
    公共无效写入(K键,V值){
    试一试{
    IgniteFuture=streamer.addData(key,value);//如何处理这个未来。我应该等待吗?
    NumberOfEntriesWritentInCache.incrementAndGet();
    }捕获(IgniteInterruptedException | IgniteDataStreamerTimeoutException | CacheException | IllegalStateException e){
    failedMap.put(键、值);
    }
    }
    公共图书馆{
    试一试{
    如果(拖缆!=null){
    如果(failedMap.size()>0){
    LOGGER.info(“写入”+failedMap.size()+“失败的条目”);
    failedMap.forEach((k,v)->writeToGrid(k,v));
    }
    }
    }捕获(非法状态异常|缓存异常|点燃异常){
    记录器错误(“写入/关闭点火开关时异常”);
    }捕获(例外e){
    记录器错误(“写入/关闭点火开关时异常”);
    }最后{
    failedMap.clear();
    如果(拖缆!=null){
    拖缆关闭();
    拖缆=零;
    }
    LOGGER.info(“写入缓存的条目数为”+numberofentriesWritentintocache.intValue());
    }
    
    }


  • 数据流将数据批量发送到其他节点。将来,当包含所提供条目的批被刷新到缓存中时,从
    addData
    方法返回的数据将完成

    因此,如果您等待从
    addData(…)
    方法返回的每个未来的完成,那么您可能永远不会等到它完成,如果未配置并且未调用
    flush()
    close()
    。即使配置了
    autoFlushFrequency
    ,对
    write()
    方法的每次调用都将等待批处理被刷新

    在所有处理结束时,尝试再次将失败条目写入数据流时,我没有看到任何不好的地方。但我真的不知道什么时候有用


    我唯一要改变的是将
    writeToGrid(k,v)
    包装在
    forEach
    中,放入它自己的try-catch块中。否则,一个异常将停止处理所有失败的条目。

    数据流将批量向其他节点发送数据。将来,当包含所提供条目的批被刷新到缓存中时,从
    addData
    方法返回的数据将完成

    因此,如果您等待从
    addData(…)
    方法返回的每个未来的完成,那么您可能永远不会等到它完成,如果未配置并且未调用
    flush()
    close()
    。即使配置了
    autoFlushFrequency
    ,对
    write()
    方法的每次调用都将等待批处理被刷新

    在所有处理结束时,尝试再次将失败条目写入数据流时,我没有看到任何不好的地方。但我真的不知道什么时候有用

    我唯一要改变的是将
    writeToGrid(k,v)
    包装在
    forEach
    中,放入它自己的try-catch块中。否则,一个异常将停止处理所有失败的条目