3

プロトタイプ Bean の再利用に関する質問が何度も寄せられたことは知っていますが、私の質問はそれ以上の意味を持っています。

何が問題ですか:

for-lookup のハンドラー (プロトタイプ Bean) で非同期タスクを開始します。しかし、前のマイルストーンに到達する前に、次の非同期タスクを開始できません。そのため、前のタスクが特別なメソッドを呼び出した後にのみ、for ループを続行する必要があります。

質問内容:

  1. 別のBeanでメソッドを呼び出す前にforループで待機する方法は?
  2. 別の Bean から現在のプロトタイプ Bean のprocedLookUp() メソッドを呼び出すことはできますか?

@Service(value = "Request.Start")
@Scope("prototype")
public static class Start {

  public Start() {}

  private Object lock;

  @Transactional
  public void handler(Request request, Response response) {

    for (int i = 0; i < request.getAmount(); i++) {
      Utils.asyncProcessStart(); //Can't start the next async process before the previous rich some defined milestone
      lock.wait();
    }
  }

  public void proceedLookUp() {
    lock.notify();
  }
}

@Service
public void AsynchronousTask {

  public void asyncAction() [
    //Needed logic, before start the next async task
    getStartHandler().proceedLookUp();
  }

  public void getStartHandler() {
    //HOW TO REWRITE NEEDED PROTOTYPE BEAN
  } 
}

添加:

問題は何ですか: 私は Activiti フレームワークを使用していますが、これにはいくつかの制限があります。いくつかの変数をプロセス (スレッド) コンテキストに格納する必要があります。変数をグローバル コンテキストに書き込むことはできますが、プロセス (スレッド) が開始される前にローカル プロセス (スレッド) コンテキストに書き込むことはできません。

たとえば、request.getAmount() が 2 を返すとしたらどうなるでしょうか?

2 つの異なるスレッドで 2 つの非同期プロセスを開始する必要があります。各プロセスには、同じ変数セットがあります各プロセス (スレッド) のローカル コンテキストに適切な変数を書き込む必要があります。しかし、プロセス(スレッド)が開始される前にそれを行うことはできません(Activitiフレームワークの固有のため)。

たとえば、各プロセス (スレッド) は、「id」プロパティを独自のローカル コンテキストに書き込む必要があります。ハンドラーメソッドにリストIDがあります

したがって、次の一連のアクションを実行する必要があります。

  1. ids.get(0) を「id」プロパティとして GLOBAL コンテキストに書き込みます
  2. 最初のプロセスを開始する
  3. for ループでハングアップする
  4. [最初のプロセス内] グローバルからローカルのコンテキストに「id」プロパティを書き込む (最初のプロセス内で可能)
  5. 適切な Start Bean に、for ループを続行できることを通知します。
  6. ids.get(1) を「id」プロパティとして GLOBAL コンテキストに書き込みます
  7. 2 番目のプロセスを開始する
  8. for ループでハングアップする
  9. [2番目のプロセス内]グローバルからローカルのコンテキストに「id」プロパティを書き込みます(2番目のプロセス内で可能です)
  10. 適切な Start Bean に、for ループを続行できることを通知します。

同期的に呼び出すことができないのはなぜですか?

すでに理解しているように、最初のプロセス (スレッド) が、2 番目のプロセス (スレッド) の for ループによって上書きされる前に、ローカル コンテキストに "id" プロパティを書き込むという保証はありません。

4

1 に答える 1