Java Executor Service 使用要注意的一点

最近公司一个系统遇到了奇怪的问题,一个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);

你可能感兴趣的:(Java)