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