質問です:メソッド は無期限(waybeリソースを待っている、または他の 何かを)ブロックされないことを確認するためにfeasibile方法はありますか?
スケジューリングを正確な定期的な間隔で計画することができない場合は、固定遅延を使用せず、遅延+最終実行の2つの条件を使用する必要があります。
2つの条件が満たされているかどうかをチェックするタスクをスケジューリングし、その場合は重要な処理を実行できます。そうでなければ、次のスケジュールを待つ。
このようにして、ブロックしないでください。タスクが固定遅延を超過すると、しばらく待つことができます。固定遅延が頻繁に超過するため問題がある場合は、おそらく固定遅延を使用しないでください。そうでない場合は、それを敏感に増やしてください。ここで
例(編集せずに書いて申し訳ありませんが間違いであれば。):
private boolean isLastImportDataTaskFinished;
@Scheduled(fixedDelay = 300000)
public void importDataTaskManager(){
if (isLastImportDataTaskFinished()){
new Thread(new ImportantDataProcessing())).start();
}
else{
// log the problem if you want
}
}
private isLastImportDataTaskFinished(){
// to retrieve this information, you can do as you want : use a variable
// in this class or a data in database,file...
// here a simple implementation
return isLastImportDataTaskFinished;
}
のRunnableクラス:
public class ImportantDataProcessing implements Runnable{
public void run(){
importData(); //db calls, file manipulations, etc..
}
}
コメント:
しかし、私は実行する場合それはスレッドとして私がそれを超えるとそれを見つける場合、私はそれを殺すことができます 私はそれを参照していないので、時間制限は( の考えでは、第2のタスクを使用してスタック状態を判断しています)?
ExecutorService(ここでは質問があります:How to timeout a thread)を使用できます。ここで
非常に単純な例:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future future = executor.submit(new ImportantDataProcessing());
try {
future.get(100, TimeUnit.SECONDS);
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (ExecutionException e) {
e.printStackTrace();
}
catch (TimeoutException e) {
// the timeout to handle but other exceptions should be handled :)
e.printStackTrace();
}
executor.shutdown();
興味深い情報がImportantDataProcessing
処理によって返されることがあります場合は、あなたが将来を入力するタスクの代わりに、実行可能なインスタンスを使用することができます。
デッドロックが見つかった方が良い方法ですが、どこが襲っているのかわかりません。私たちが修正案を提案できるかどうかは疑問です。 –