2016-12-08 23 views
5

私はSpring Boot(ver 1.4.2)アプリケーションで多くのスケジュールされたタスクを持っており、可能であるようなハンドラを使ってすべての例外をキャッチしたい注釈が@ExceptionHandlerの通常のコントローラの場合Java設定のSpring(Boot)の@Scheduledタスクのユニバーサル例外ハンドラ

@Component 
public class UpdateJob { 
    @Transactional 
    @Scheduled(cron = "0 1 0 * * *") 
    public void runUpdateUsers() { 
     userService.updateUsers(); 
    } 

    @ExceptionHandler 
    public void handle(Exception e) { 
     // some more logic here 
     logger.error(e.getMessage()); 
    } 

} 

@ExceptionHandlerが@Scheduled方法のために動作しません(それはそれが意味するものではない判明):このアプローチは、理由のスレッドの@Scheduledアノテーションで定義されたタスクのために動作しません。代わりに、春ブーツは、それが自分のLoggingErrorHandlerだ使用しています。

2016-12-08 15:49:20.016 ERROR 23119 --- [pool-7-thread-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task. 

私は何とかスケジュールされたタスクのデフォルトの例外ハンドラを交換したり、供給することができますか?または、私が理解しているようにエラーをさらに伝播するPropagatingErrorHandlerに切り替えることは意味をなさないでしょうか? Java構成(XMLなし)のみを使用して目標を達成する他の方法はありますか?

それが明示的に(任意のXML設定せずに春ブーツプロジェクトに組み込むまともです)のためのJava構成ではなく、XMLに基づくソリューションを要求するので、これはthis questionの複製ではありません。

また、TaskSchedulerを最初から設定する方法を示すいくつかの回答があります。たとえば、answerでは、プールサイズ、最大プールサイズ、キュー容量も定義する必要があります。 Hereは、非常に広範な構成も必要とするソリューションです。 Documentationは、他の側面を設定する方法を示しますが、エラー処理を指定する方法は示しません。しかし、私はSpringブートのデフォルト値(スレッドプール、エグゼキュータ設定など)を最大限に保つために、Java設定で最低限必要な作業は何ですか?

+0

例外ハンドラはWebハンドラメソッド用です。 –

+0

推論を提供してください。メソッドやクラスに例外ハンドラを使用できない理由はありますか?用語「Webハンドラ」はASP.netにも当てはまりますが、おそらくそれは異なっていますか? –

+0

これはwebmvcインフラストラクチャの一部です。それは '@ Controller'で使われることを意図しています。あなたがリンクしたjavadocを読んでください。 –

答えて

4

コメントで述べたように、@ExceptionHandlerはSpring MVCコントローラ用です。

単一のスケジューラの例外処理ロジックを使用したい場合は、最も簡単でメンテナンスが容易なのは、try-catchブロックにラップしてエラーを処理することです。

さまざまなスケジューラに同じエラーハンドラを適用する場合は、@Mを参照してください。 Deinumの提案。

+0

ありがとう!この特定の@ExceptionHandlerは、実際にこの目的のために設計されていないようです。私はエラーハンドラを提供したいだけですが、他のエグゼキュータのプロパティは変更しません。スケジューラ自体を管理しない限り、スケジューリングされたタスク(@Bean?)に例外処理を提供する方法がないことを理解しています。 –

関連する問題