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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值