私はSpringの@EnableAsync
機能を使用してメソッドを非同期に実行しています。私はApache Shiroを使っています。非同期に実行されるコードでは、非同期呼び出しをトリガしたスレッドに接続されたShiroサブジェクトにアクセスする必要があります。shiroのSpringの@Asyncサポートのカスタマイズ/拡張
史郎が別のスレッドで実行されるCallable
を対象に関連付けることによって、別のスレッド内の既存の主題を使用してサポートしています(hereを参照してください):残念ながら
Subject.associateWith(Callable)
私が直接アクセスすることはできません。このものはSpringによってカプセル化されているのでCallable
に移動します。私は、SpringのAnnotationAsyncExecutionInterceptor
を拡張して、作成したCallable
と私のサブジェクトを関連付ける必要があることを発見しました(これは簡単な部分です)。
問題は、私のカスタムAnnotationAsyncExecutionInterceptor
をデフォルトのものの代わりに使用する方法です。既定値はAsyncAnnotationAdvisor
とAsyncAnnotationBeanPostProcessor
に作成されます。もちろんこれらのクラスを拡張することもできますが、これは、Springが自分の拡張クラスを再び使用するようにするために問題にシフトするだけです。
私が欲しいものを達成する方法はありますか?
新しいカスタム非同期アノテーションを追加しても問題ありません。しかし、私はこれが多くの助けになるとは思わない。
UPDATE: は実際にAnnotationAsyncExecutionInterceptor
をカスタマイズする必要があるだろうというのが私の発見は間違っていました。偶然、私はorg.apache.shiro.concurrent.SubjectAwareExecutorService
を見つけました。これは、私が欲しいものをきちんとしてくれて、私は単にインターセプタをカスタマイズするのではなく、カスタム実行者を提供することができたと思いました。詳細は私の答えを見てください。
Callableを返すために、あなたの「非同期メソッド」を書き直すことができます。2.手動で(スプリングで設定されたexecutionPoolで)em off( 'call()') – xerx593