2016-05-08 10 views
1

私は、一定時間後に複数のスレッドを使用して、ScheduledExecutorServiceを使用してJavaアプリケーションを使用しています。 1時間に1つのスレッドが起動し、何らかの作業が行われ、正しく終了します。しかし、時には(例えば、HTTPリクエストが機能しないとき)、このスレッドはクラッシュし、エグゼキュータ・サービスはそのようなスレッドをこれ以上開始しません。それから、アプリケーションを終了し(Ctrl-Cを使用して)、もう一度それを再起動する必要があります。スレッドがクラッシュした後にJavaアプリケーションが正しく動作しない

クラッシュするスレッドが新しいスレッドをインスタンス化するためにExecutorServiceを中断する可能性はありますか? アプリケーションがまだ動作しているかどうかは、自分のRaspberry Piで動作しているため、24時間365日実行する必要があるため、常に確認したくありません。

多分私の問題の解決策を見つけるのを助けることができます!

EDIT

ExecutorServiceのは、独自のスレッドで実行されます。これは、スレッドが開始されている方法です。

@Override 
public void run() { 
    threadFuture = executorService.scheduleAtFixedRate(new IntervalThread(i, p, c, a), 60, 60, TimeUnit.MINUTES); 
} 

そして、これは60分ごとに呼び出されたスレッドです:

@Override 
public void run() { 

    try { 
     // do some HTTP request here 
     // if an error occurs, catch it and log the error message 
    } catch (Exception e) { 
     LOGGER.error(e.getMessage()); 
    } 
} 

(HTTP要求を行い)スレッドがchrashed場合は、全体ExecutorServiceのもはや働いていません。すべての例外を捕まえると、どうすればそれが可能になりますか?タスクのいずれかの実行が例外に遭遇した場合

+0

コードスニペットは参考になります。 –

答えて

2

あなたの場合はScheduledThreadPoolExecutor

いるので、説明を持っている、後続の実行が抑制されています。何らかのエラー(例えば、OutOfMemoryErrorの)が発生した

  1. :あなたはtry{}catch(Exception)ブロックで全体のタスク/作業を実行しているが

、Throwableのはcatchブロックを「エスケープ」可能性がある場合があり、 。

  • ログ記録中にログコードLOGGER.error(e.getMessage());が例外をスローしました。

  • 私は何が起こっているかを理解するために、あなたに以下の変更をお勧めします: `ExecutorService`の初期化と、あなたの` Runnable`クラスの

    @Override 
    public void run() { 
    try { 
        try { 
        // do some HTTP request here 
        // if an error occurs, catch it and log the error message 
        } catch (Exception e) { 
        LOGGER.error(e.getMessage()); 
        } 
    } catch (Throwable t){ 
        t.printStackTrace(); // this would require redirect output like java -jar my.jar >> error_log.txt 
        // try clean up and exit jvm with System.exit(0); 
    
    }  
    
    +0

    ありがとう!私は正確に何が正しく動作していないかを知ることができれば幸いです。私はちょうど私の* .jarを正しく起動する* MANIFEST *ファイルを作ることができる方法をgoogleに持っていなければなりません:)) – beeef

    関連する問題