0

スケジュール メソッドを使用して TimerTask で Java アプリケーションを実行しています。つまり、特定の間隔で実行され、timertask が遅延した場合、キャッチアップを試みません。無期限ではないにしても、プログラムをできるだけ長く実行したい。Netbeans 7.3 を使用しています。

しかし、数時間後 (場合によっては 1 時間、場合によっては 24 時間以上) に、プログラムはコンソールへの出力を停止し、実際には完全に実行を停止します。プログラムも定期的に電子メールを送信するため、コンソールへの印刷が停止するだけではなく、停止すると電子メールも送信されなくなります。常に「ビルド完了」と表示されたり例外がスローされるとは限りませんが、単に「ビルド完了」と表示されて実行が停止する場合もあります。

私はウェブを見回してみましたが、決定的な答えを見つけることができないようです. 未チェックの例外がスローされると TimerTask の実行が停止することをどこかで見ましたが、TimerTask の最後で常に停止するとは限らず、タスクの途中のランダムな時点で停止するため、それが原因だとは思いませんハプニング。

何が問題なのか、どうすれば回避できるのか、誰にもわかりませんか?

どんなポインタでも大歓迎です。

ありがとう、ポール

編集: ロガーをタイマータスクに入れようとした後、コードは次の例外でエラーになりました: java.io.IOException: Logging.txt のロックを取得できませんでした。私はロガーを使ったことがないので、これは別の問題かもしれません。この例外はおそらく、Java でファイルに書き込むためのいくつかのアクセス許可が不足していることを意味することをどこかで読みました (そうであるかどうか、または Netbeans で修正する方法がわからない)。ロガーを修正し、それが無関係である場合、この編集を削除します

編集:ブロードキャスト機能には、さまざまなサーバーとの多くの通信が含まれることを忘れていました。問題は、プログラムが単に行でスタックして完了しないことである可能性があると思います。この場合、ブロードキャスト メソッドが一定時間後にタイムアウトする方法を見つけて、再試行する必要があります。

編集:これが私のコードの例です:

    public void RUN(){
                exchanges.add(Bitstamp);
                exchanges.add(BTCE);
                exchanges.add(CampBX);
    t.schedule(
    new TimerTask()
         {
        public void run()
         {
     Broadcast(exchanges);


    UseLogger.Log();
         }
}, 0,15000);

}

public static void Broadcast(ArrayList<Exchange> exchanges){
 for (int i=0; i<exchanges.size();i++){
       exchanges.get(i).prepareGetUpdate();
   }
        System.out.println("************** TICKERS *****************");
        try{
    for (int i=0; i<exchanges.size();i++){
        System.out.println(exchanges.get(i).getPrices());
    }
        tickerException=false;
        } catch (Exception e){
        tickerException=true;
    }

    System.out.println("");
    System.out.println("************** BALANCES *****************");
    try{
    for (int i=0;i<exchanges.size();i++){
        System.out.println("i: " + i);
        System.out.println(exchanges.get(i).getBalance());

    }
    balanceException=false;
    } catch (Exception e){
        balanceException=true;
    }
      System.out.println("************ ORDERS *****************");
    try{
    for (int i=0; i< exchanges.size();i++){
       exchanges.get(i).getOrders(); 
       if (exchanges.get(i).exchangeName.contentEquals("BTCE")){
           exchanges.get(i).Total_btc+=exchanges.get(i).btcInOrders;
           exchanges.get(i).Total_usd+=exchanges.get(i).usdInOrders;
       }
    }
    orderException=false;
    } catch (Exception e){
        orderException = true;
    }

    for (int i=0; i< exchanges.size();i++){
       exchanges.get(i).getUpdate(); 
    } 



    btcDiff = totalBTC-originalTotal;
    btcNeutral=true;
}
4

0 に答える 0