使用IgniteDataStreamer API的正确方法

时间:2018-09-20 12:37:23

标签: ignite

我有一个多线程应用程序,该应用程序一直使用write()方法来编写以点燃缓存。在启动时,它将调用init()方法,该方法创建一个缓存和流媒体对象。完成所有线程后,将调用flush(),这将关闭流媒体并写入所有未能插入到write()方法中的键。我有一些疑问。

  1. 在write()方法中,我应该如何使用IgniteFuture?我应该等待它完成吗?

  2. 将条目写入高速缓存或流媒体内部缓冲区时,这种将来会完成吗?

  3. 在flush()方法中,我正在关闭流对象之前在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());
    }
    

    }

1 个答案:

答案 0 :(得分:4)

数据流化器将数据批量发送到其他节点。将具有提供的条目的批处理刷新到缓存中后,从addData方法返回的Future完成。

因此,如果您等待从addData(...)方法返回的每个未来的完成,那么如果未配置autoFlushFrequencyflush()或{{ 1}}没有被调用。而且即使配置了close(),每次对autoFlushFrequency方法的调用都将等待,直到刷新该批处理为止。

在所有处理结束后,尝试再次将失败的条目再次写入数据流式传输器时,我没有发现任何不良情况。但是我真的不知道哪种情况有用。

我唯一要更改的是将write()内的writeToGrid(k, v)包装到其自己的try-catch块中。否则,一个异常将停止处理所有失败的条目。