最近公司一个系统遇到了奇怪的问题,一个scheduled task在系统启动后第二天就自动消失了,立马让我想起来前年在另外一个系统中使用hazelcast的时候也遇到了类似的问题(http://blog.csdn.net/cloud_ll/article/details/37695889),当时对Java Scheduled Task了解不够,没有查明白为什么。这一次终于明白了为什么。Java Executor Service对于提交的任务如果遇到了没有处理的异常,就会认为任务遇到了不可预知的错误,理所当然就会中止执行。不过在Java Executor Service在终止的时候没有任何提示。。。
在我们现在这个系统中我们提交的任务如下:
service.scheduleAtFixedDelay(new Runnable() {
publicvoid run() {
try{
.......
} catch (Exception e){
LOG.error("unexpected error!",e");
}
}
}, 0, 5, TimeUnit.SECONDS);
可以看到我们已经处理了异常,为什么还会出问题呢?很简单出的是Error。。。OutOfMemoryError: Direct buffer memory……
所以catch从exception变成了throwable,并且分析转到了为什么会出现Direct buffer memory allocation Error。
这样回过头来看之前遇到的hazelcast那个问题,也是没有处理异常导致task被中止了。修改如下,不知道hazelcast后来解决了这个问题没。
node.executorManager.getScheduledExecutorService().scheduleAtFixedRate(new Runnable() {
public void run() {
try{
for (CMap cMap : maps.values()) {
cMap.startCleanup(false);
}
} catch (Throwable e){
LOG.error("unexpected error!",e);
}
}
}, 1, 1, TimeUnit.SECONDS);