2017-03-23 3 views
1

私は1 WMを持っているために参加する:WebSphereのワークマネージャは、いくつかの方法で作品を開始し、多くのスレッド

public void someMethod(Params pararms){ 
    WorkManager wm = (WorkManager) ic.lookup(CONTROL_WORK_MANAGER); 
    ArrayList<WorkItem> workItems = Lists.newArrayList(); 
    List<Work> works = getSomeWorks(); 
    for (Work work : works) { 
     workItems.add(wm.startWork(work)); 
      } 
    //after all works have been started, I just wait for them to be finished using join method: 
    wm.join(workItems, WorkManager.JOIN_AND, (int) WorkManager.INDEFINITE); 

    // "other code" 
    } 

someMethod()は、与えられた作品は完成させるためだけ待たずに別のスレッドによって呼び出され、問題がwm.join()ですしかし、すべてのスレッドによって開始されたすべての作業について。 最終的に"other code"は、アプリ内のすべての作業が終了すると実行されます。

それはそれがすべき方法ですか?もしそうなら、私はそれを修正することができますので、wm.join()は "その"作業が完了するのを待つだけですか?

はバージョンWAS 8.5.5.11

ありがとうです!

答えて

3

WorkManagerの文書化された動作に従って、指定されたリスト内の項目を待つ必要があります。

https://www.ibm.com/support/knowledgecenter/SS7K4U_8.5.5/com.ibm.websphere.javadoc.doc/web/apidocs/com/ibm/websphere/asynchbeans/WorkManager.html

具体的には、 JOIN_ANDは、次のように定義される「この定数は、参加方法は、リスト完成するですべての作業項目を待つ必要があることを示すために、参加方法のアンドールのパラメータに使用されています。」

あなたが記述した動作はバグのように聞こえますが、それを再現できるかどうかを確認します。

この動作がバグであることが判明し、それを置き換える必要がある場合、1つの方法は、java.util.concurrent.CountDownLatchをデクリメントするWorkListenerを登録することです。あなたはあなたの投稿者のスレッドから待つことができます。あなたは、Java EE 7のサポートのためだったV9に移動することができるならば、あなたが本当にしたいことは&待機を提出組み合わせたjavax.enterprise.concurrent.ManagedExecutorService.invokeAll()であるように

final CountDownLatch latch = new CountDownLatch(works.size()); 
WorkListener listener = new WorkListener() { 
    public void workAccepted(WorkEvent we) {} 
    public void workStarted(WorkEvent we) {} 
    public void workCompleted(WorkEvent we) { 
     latch.countDown(); 
    } 
    public void workRejected(WorkEvent we) { 
     latch.countDown(); 
    } 
}; 
for (Work work : works) { 
    workItems.add(wm.startWork(work, WorkManager.INDEFINITE, listener)); 
} 
latch.await(); 

代わりには、それが聞こえます組み込みの動作。

+0

ありがとう、本当に便利です! – SergeiK

関連する問題