我有一个多线程应用程序,该应用程序一直使用write()方法来编写以点燃缓存。在启动时,它将调用init()方法,该方法创建一个缓存和流媒体对象。完成所有线程后,将调用flush(),这将关闭流媒体并写入所有未能插入到write()方法中的键。我有一些疑问。
在write()方法中,我应该如何使用IgniteFuture?我应该等待它完成吗?
将条目写入高速缓存或流媒体内部缓冲区时,这种将来会完成吗?
在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());
}
}
答案 0 :(得分:4)
数据流化器将数据批量发送到其他节点。将具有提供的条目的批处理刷新到缓存中后,从addData
方法返回的Future完成。
因此,如果您等待从addData(...)
方法返回的每个未来的完成,那么如果未配置autoFlushFrequency且flush()
或{{ 1}}没有被调用。而且即使配置了close()
,每次对autoFlushFrequency
方法的调用都将等待,直到刷新该批处理为止。
在所有处理结束后,尝试再次将失败的条目再次写入数据流式传输器时,我没有发现任何不良情况。但是我真的不知道哪种情况有用。
我唯一要更改的是将write()
内的writeToGrid(k, v)
包装到其自己的try-catch块中。否则,一个异常将停止处理所有失败的条目。