2017-04-20 7 views
0

アプリケーションは、返信タイプが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); 
    } 
} 
+1

https://spring.io/guides/gs/async-method/ - 、私は、この方法が@Async注釈されていると仮定し、ここを見て、非同期は – white

+0

を有効になっている** @白**おかげで!私はサービスメソッドの '@Async'アノテーションと設定クラスの' @ EnableAsync'を気付かなかった。春は怪物になった。 – gavenkoa

答えて

1

として、私は、構成クラス上のサービスメソッドと@EnableAsync上@Asyncアノテーションを持って予測しました。 Future戻り型の場合

http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/htmlsingle/#scheduling-annotation-support-exception

将来のオブジェクトに伝播例外(ListenableFutureがそれのサブタイプである)とFuture.get()メソッドの呼び出しで発生した例外ExecutionException.getCause()から取得することができる。

例外処理セクションで説明しました。

私の場合、戻り値の型は無視されます(.get()は呼び出さないでください)。したがって、例外はキャプチャされずに記録されました。私が最初に書いたように、この場合、腹立たしい伐採は仕事そのもので行われるべきです。

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutionException.html

関連する問題