Java Exector Serviceの使用に注意する点

1977 ワード

最近会社のシステムが変な問題に遭遇しました.一つのscheduled taskはシステム起動後の翌日に自動的に消えてしまいました.すぐに思い出します.一昨年にもう一つのシステムでhazel castを使った時も同様の問題がありました.http://blog.csdn.net/cloud_ll/article/details/37695889)Java Scheduled Taskに対する理解が足りなくて、なぜか調べられませんでした.今回はやっと分かりました.なぜですか?Java Exector Serviceは提出したジョブに対して処理の異常がない場合、タスクが予期せぬエラーに遭遇したと考え、当然実行を中止します.ただし、Java Exector Serviceでは終了時には何のヒントもありません.
私たちが今このシステムで提出している課題は以下の通りです.
service.scheduleAtFixedDelay(new Runnable() {
           publicvoid run() {
               try{
                  .......
               } catch (Exception e){
                  LOG.error("unexpected error!",e");
               }
           }
        }, 0, 5, TimeUnit.SECONDS);
私たちはすでに異常を処理したと見られますが、なぜ問題が発生しますか?簡単に出るのはErrerです.OutOfMemoryError:Direct buffer memory…だからcatchはexceptionからthrowableになりました.そしてなぜDirect buffer memory allocation Errが現れたのかを分析しました.
このように振り返ってみると、前に遭遇したハゼールキャストの問題も、異常を処理していないため、taskは中止されました.下記のように修正して、ハゼラブcastが後でこの問題を解決しましたか?
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);