2

run()ランナブルのメソッドに次のコードを書きました。

try {
    dbConnection = MyApp.datasource.getConnection();
} catch (SQLException e) {
    logger.log(Level.SEVERE, "Could not obtain a DB connection! Re-enqueuing this task. Message: " + e.getMessage(), e);
    MyApp.executor.execute(this);
    return;
}

ご覧のとおり、タスクが DB 接続を取得できない場合は、実行前と同じキューに再エンキューする必要があります。

これはおそらく安全だと思いますが、おかしい気がします。見逃している問題がないことを確認したいだけです。

ありがとう!

4

2 に答える 2

4
  1. いわゆるポイズンメッセージSQLExceptionが発生するリスクがあります。逃げられない場合、タスクは無限に繰り返されます。ある種のカウンターまたはタイマーを提供する必要があります。

  2. エグゼキュータの占有率(すでにスケジュールされている同時タスクの数)に応じて、再試行の間隔は大幅に異なる場合があります。CPUを100%使用するか、非常に長い時間再試行を待つ可能性があります。

  3. 偶然にも、タスク(自分自身を再スケジュールするタスク)が子(再スケジュール)呼び出しの結果を待機している場合、エグゼキュータが1つのスレッドのみで実行されると、デッドロックが発生する可能性があります。

  4. の生のフィールドを使用していますがMyApp、パターンが悪いようです。

全体的なアイデアについては、ループを入れてみませんrun()か?実行されている他のタスクに対してより「公平」になりたいですか?

于 2011-02-17T21:21:11.880 に答える