@Async
アノテーションが付いているメソッドは、今後取り消すことができます。Spring Cancel @Async Task
私は@Async
アノテーションでマークされたSpringメソッドを持っています。このメソッドは計算を実行し、最終的に結果を返します。私が見たすべての例では、このFutureを返すためにAsyncResult
クラスを使用することをお勧めします。
@Async
public Future<String> run() {
// ... Computation. Minutes pass ...
return new AsyncResult<String>("Result");
}
私は以下の方法で別のコンポーネントから次のメソッドを呼び出します。例えば、このスレッドを直ちに取り消したいと思います。
Future<String> future = component.run();
future.cancel(true);
この場合、スレッドは決してキャンセルされません。これは、AsyncResult
のSpringインプリメンテーション:https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/java/org/springframework/scheduling/annotation/AsyncResult.java#L71を見ているので、このメソッドは実際には1つのことをしないためです。単にスレッドを取り消すことができないというfalseを返します。これは私の問題です。 @Async
メソッドで作成されているスレッドをキャンセルするにはどうすればよいですか? Springで作成された内部スレッドへのアクセス権がありません - キャンセルする方法はありませんか?
これらの2つの回答[ここ](http://stackoverflow.com/questions/21084195/spring-async-cancel-and-start)と[ここ](http://stackoverflow.com/questions/35798987/)を確認してください。 stop-an-async-spring-method-from-caller-class)、あるいは '@Async'アノテートされたメソッドを扱うカスタム' ThreadPoolExecutor'を作成するか、実行中のタスクにバインドするカスタムの 'AsyncResult'を渡します。 – AntJavaDev
これらの質問の答えは、実行中のスレッドに後で処理を停止するように指示するために、フラグ/セマフォの作成を記述しているようです。これは、Future.cancel()メソッドが自己定義された 'Runnable'内で行うようにスレッドを終了させることとは異なります。 カスタム 'ThreadPoolExecutor'がどのように見えるか少し説明できますか?私は自分のエグゼクティブも定義しているので、それを追加するのは難しくないか不便ではありません。 –