10

Tomcat サーバーの起動時にデーモン メール サービス スレッドを開始したいと考えています。そのため、メソッドに @Async アノテーションを付けました。

ApplicationListener インターフェイスを実装するクラスがあります。このクラスから非同期メソッドを呼び出すと、非同期に開始されず、現在のスレッドがブロックされます。そして、スプリングコントローラークラスから非同期メソッドを呼び出すと、ブロックされず、非同期で開始されます。

async メソッドが 1 つのクラスから正常に実行され、他のクラスからは正常に実行されなかったのはなぜですか?

サーバーの起動時に非同期メソッドを実行するにはどうすればよいですか??

前もって感謝します。

編集: InitializingBean インターフェイス、@PostConstruct、init-method アプローチを使用して非同期メソッドを呼び出してみましたが、実行されませんでした。次に、デフォルトの lazy-init が true であることを認識したので、InitializingBean の lazy-init を false に設定します。これで asnyc メソッドが実行されますが、現在のスレッドがブロックされ、もう 1 つの問題に直面しています。サーバーが正常に停止しなかったため、サーバーを強制的に停止する必要があります。

4

5 に答える 5

13

まず第一に、ApplicationListenerインターフェースを実装する必要はありません。Spring を使用しています - アプリケーション コンテキストで十分です。

次に、Spring について話している@Asyncと、タスクを Application Context から開始する必要があり、Controller Bean がその一部であることを意味します。

<annotation-driven>spring xml ファイルに含まれていることを確認する必要があります。

@PostConstruct 関数でタスクを開始できます。

@Component
public class SampleBeanImpl implements SampleBean {

  @Async
  void doSomething() { … }
}


@Component
public class SampleBeanInititalizer {

  @Autowired
  private final SampleBean bean;

  @PostConstruct
  public void initialize() {
    bean.doSomething();
  }
}
于 2012-05-01T08:23:15.947 に答える
4

Springのリファレンスに基づく@Asyncと、アプリケーションの起動時にの使用には制限があります。

@Asyncなどのライフサイクルコールバックと組み合わせて使用​​することはできません @PostConstruct。Spring Beanを非同期的に初期化するには、現在 @Async、ターゲットで注釈付きメソッドを呼び出す別の初期化SpringBeanを使用する必要があります。

したがって、あなたの場合、InitializingBeanターゲットBeanを使用して実装し、それを介してデーモンを起動するとよいでしょう。

于 2012-05-01T08:30:01.870 に答える
2

<annotation-driven>タグをアプリケーション コンテキストに追加しましたか? Spring リファレンス ドキュメントから:

@Scheduled アノテーションと @Async アノテーションの両方を有効にするには、タスク名前空間の「アノテーション駆動型」要素を構成に含めるだけです。

executorインスタンスの構成も検討する必要があることに注意してください。タスク スキーマ定義から:

構成可能なプール サイズ、キュー容量、キープアライブ、および拒否ポリシーの値を持つ ThreadPoolTask​​Executor インスタンスを定義します。この XML 要素のコードベースの代替方法については、org.springframework.scheduling.annotation.EnableAsync アノテーションの Javadoc を参照してください。

したがって、5 つのスレッドを持つスレッド プールによってバックアップされるエグゼキューターを作成するには、次の手順を実行する必要があります。

<task:annotation-driven executor="myExecutor"/>
<task:executor id="myExecutor" pool-size="5"/>

その他の構成オプションについては、上記の@EnableAsync javadocを参照してください。

于 2012-05-01T08:53:07.027 に答える
1

私の英語はプールです。サービス クラス @Lazy(false) を設定する必要があります。

于 2013-11-05T03:10:56.857 に答える
0

@asynはSpringFrameworkの一部ですが、リスナーの使用法はSpringコンテキストですか?そうでない場合は、非同期メソッドで新しいスレッドを開始することをお勧めします。

于 2012-05-01T08:21:27.377 に答える