私は2つの同期メソッドを持っていますが、次のものはブロックしません。なぜ私の@Async Future <T>ブロック?
@RequestMapping("/send1")
@Async
public Future<Boolean> sendMail() throws InterruptedException {
System.out.println("sending mail 1..-"
+ Thread.currentThread().getName());
Thread.sleep(1000 * 16);
System.out.println("sending mail 1 completed");
return new AsyncResult<Boolean>(true);
}
しかし、以下の1ブロック。
@RequestMapping("/send3")
public void callAsyn3() throws InterruptedException, ExecutionException {
Future<Boolean> go = sendMail3("test");
}
@Async
public Future<Boolean> sendMail3(String msg) throws InterruptedException {
boolean acceptedYet = false;
Thread.sleep(1000 * 12);
if (!msg.equalsIgnoreCase("")) {
acceptedYet = true;
}
return new AsyncResult<>(acceptedYet);
}
これらは同じコントローラクラスに属していますが、なぜこのような動作が異なるのですか?
: 通常の修正は - 、asyncSendMailComponentにsendMail3を移動し、asyncSendMailComponent /サービスをおコントローラにasyncSendMailComponentを注入し、コントローラにsendMail3
を呼び出す - 新しいサービスを作成しますあなたが内部的に呼び出すメソッド。 '@Async'は無視されます(プロキシされたメソッドは呼び出されません)。 – StanislavL
手動で呼び出す方法は? –
jdkプロキシの代わりにcglibプロキシに切り替える必要がある場合は、何をしたいのですか – JEY