私は春のアプリケーションがあり、プロトタイプのBeanを固定レートで生成する予定のロジックがあります。これは、最初のスケジュール呼び出しです春の豆の作成フロー:終了時を知る方法?
2016-12-13 04:13:01.885 ERROR 4688 --- [TaskScheduler-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task.
...
BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'metaDataSourceAdvisor': Singleton bean creation not allowed
while the singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
...
:
すべては私のラップトップではなく、私のアプリが原因の起動に失敗したサーバーにデプロイした後、正常に動作します。タイミングの問題のように見えます。私のラップトップアプリケーションでは、はるかに高速に初期化され、最初のスケジュールされた呼び出し(プロトタイプのBeanを生成する)に対して何も間違ったことは起こりません。
Spring Beanの作成フローの現在の状態を知る方法はありますか?スケジュールされたロジックをチェックして、アプリケーションの作成が完了していないときは何も生成できませんか?
ありがとうございます!
完全なコールスタックをポストする必要があります。ラップトップ環境とサーバー環境の違いについてもっと詳しく書くことができますか?サーバーはサーブレット/アプリケーションコンテナであり、開発に使用されたものとは異なりますか? –
こんにちは、クラウス!私の質問です:スケジュールされたロジックでSpringアプリケーションの初期化の現在の状態を教えてくれるSpringコアのすぐに使えるBeanを注入できますか?私はアプリが初期化されていないときにプロトタイプのBeanを生成したくないので、 –
私はSOに関するコメントを持っているので、以下の答えを見てください。基本的にコンテキストの作成はシングルスレッドです。 ApplicationContext.getBean()を呼び出す場合、そのスレッドがスプリングコンテキストのライフサイクルと同期していることを確認してください。スレッドがサーブレットコンテナなどのランタイムによって提供されている場合は、AbstractApplicationContext.isActive()および.isRunning()を使用できますが、すべての並行プログラミングと同様に、状態を読み取った後にコンテキストが閉じられる可能性があります。スプリングで管理されているスレッドに対してのみスプリング操作を実行する必要があります。 –