プロトタイプ Bean の再利用に関する質問が何度も寄せられたことは知っていますが、私の質問はそれ以上の意味を持っています。
何が問題ですか:
for-lookup のハンドラー (プロトタイプ Bean) で非同期タスクを開始します。しかし、前のマイルストーンに到達する前に、次の非同期タスクを開始できません。そのため、前のタスクが特別なメソッドを呼び出した後にのみ、for ループを続行する必要があります。
質問内容:
- 別のBeanでメソッドを呼び出す前にforループで待機する方法は?
- 別の 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があります
したがって、次の一連のアクションを実行する必要があります。
- ids.get(0) を「id」プロパティとして GLOBAL コンテキストに書き込みます
- 最初のプロセスを開始する
- for ループでハングアップする
- [最初のプロセス内] グローバルからローカルのコンテキストに「id」プロパティを書き込む (最初のプロセス内で可能)
- 適切な Start Bean に、for ループを続行できることを通知します。
- ids.get(1) を「id」プロパティとして GLOBAL コンテキストに書き込みます
- 2 番目のプロセスを開始する
- for ループでハングアップする
- [2番目のプロセス内]グローバルからローカルのコンテキストに「id」プロパティを書き込みます(2番目のプロセス内で可能です)
- 適切な Start Bean に、for ループを続行できることを通知します。
同期的に呼び出すことができないのはなぜですか?
すでに理解しているように、最初のプロセス (スレッド) が、2 番目のプロセス (スレッド) の for ループによって上書きされる前に、ローカル コンテキストに "id" プロパティを書き込むという保証はありません。