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では終了時には何のヒントもありません.
私たちが今このシステムで提出している課題は以下の通りです.
このように振り返ってみると、前に遭遇したハゼールキャストの問題も、異常を処理していないため、taskは中止されました.下記のように修正して、ハゼラブcastが後でこの問題を解決しましたか?
私たちが今このシステムで提出している課題は以下の通りです.
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);