アプリケーションは、返信タイプがListenableFuture<>
の単一のメソッドで通知を送信するためのインターフェイスを宣言します。ListenableFuture戻り値が別のスレッドで実行されるBeanメソッドですか?
メールサービスの場合バッチジョブで設定が誤っている場合(たとえば、SMTPサーバがダウンしているかホストが解決されていない場合など)に例外が表示されません。
mailService.send(mime);
スタックで解決::私はメソッド呼び出しのプロキシを受ける
MailNotificationService mailService = applicationContext.getBean(MailNotificationService.class);
:
はat org.springframework.aop.interceptor.AsyncExecutionInterceptor.invoke(AsyncExecutionInterceptor.java:101)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
invoke
のドキュメントは言う:
デバッグにすることを示している
* Intercept the given method invocation, submit the actual calling of the method to
* the correct task executor and return immediately to the caller.
いくつかの手順の後、新しいスレッドとサービスがここで実行されます。
サービスが別のスレッドで実行されているように見え、例外が元のスレッドに伝播しない(意味がある場合)。
ListenableFuture<>
の返り値型のBeanメソッドでは、別のスレッドで実行するのは間違いですか?
NB通知サービスでエラーが発生した場合(トレースは記録されません)、私は目が見えません。メールサービスは、未チェックorg.springframework.mail.MailException
をスローして、それを見つけるための唯一の方法は、ログをException
で.send()
メソッドをラップすることです:
@Autowired
private JavaMailSender mailSender;
public void notify() {
try {
mailSender.send(mime);
} catch (Exception ex) {
log.warn("Can't deliver mail", ex);
}
}
https://spring.io/guides/gs/async-method/ - 、私は、この方法が@Async注釈されていると仮定し、ここを見て、非同期は – white
を有効になっている** @白**おかげで!私はサービスメソッドの '@Async'アノテーションと設定クラスの' @ EnableAsync'を気付かなかった。春は怪物になった。 – gavenkoa