2017-11-22 4 views
1

Jersey、CDI 2.0(Weld 3.0.1.final実装)とTomcatを使用してREST Webサービスを作成しています。 Webサービスの目標は、数分または数時間でも実行できる長い計算タスクを起動することです。タスクは、Webサービスに送信されたHTTP POST要求で開始する必要がありますが、開始されたタスクは別のスレッドでジョブを実行する必要がありますが、要求はすぐに終了してクライアントに返信する必要があります。CDI 2.0:Event.fireAsync()で起動された非同期イベントの数を同時に確認する方法

イベントを非同期で処理することを可能にするCDI 2.0とそのEvent.fireAsync()メソッドを使用して解決しました。 POSTリクエストを処理するJAX-RSリソースクラスは非同期イベントを発生させ、別の@ApplicationScoped CDI Beanで非同期オブザーバメソッド(@ObservesAsyncと注釈されています)によって処理されます。

上記の解決策は素晴らしいです。しかし、非同期イベントでいくつかの長いタスクを同時に起動すると、実際には4つしか実行されず、残りがキューに入れられていることに気付きました。実行中の4つのイベントの1つが終了するとすぐに、キューに入れられた最初のイベントが処理を開始します。

だから、私の質問は以下のとおりです。

  1. CDIのイベントの本当の非同期処理のために利用可能なスレッドの数をチェックする方法は?
  2. 非同期オブザーバーメソッドでキューに登録されている処理の数を確認する方法はありますか?

答えて

1

最初の質問です - デフォルトは利用可能なプロセッサーに基づいています。 Runtime.getRuntime().availableProcessors() + 1の行に沿った何か。 しかし、あなたが後にしているのは、私が想定している設定オプションです。私はFIXED_TIMEOUTプール(スレッドを使用することをお勧めしconfiguration part of Weld doc

  • を見てみましょう

    • 使用溶接構成および事前定義されたオプション
      • から取得しません。ここでは、することができますいずれかを選択してもらいます必要のないときは、キーorg.jboss.weld.executor.threadPoolSize
      • チェックchapter 19.1を使用して、スレッドの所望の量を設定することができ、この設定のためのキーがorg.jboss.weld.executor.threadPoolType
      • です)残りますあなた自身のExecutorServices、溶接SPI

      の一部を実装することをNotificationOptions

    • を使用して(OVERKILL)を使用して独自のExecutorや火災非同期イベントを定義する溶接
  • を設定オプションを渡す方法についてあなたの2番目の質問については、ここであなたを失望させる必要があります。 Weld内でこれを達成する方法はまだありません。お気軽にcreate a WELD Jira issueにお気軽にお問い合わせください。

  • 関連する問題