2017-03-23 2 views
1

Ich habe eine WM, die Werke in irgendeiner Methode beginnt:Websphere Work für viele Threads verbinden

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() von verschiedenen Threads aufgerufen wird, und das Problem ist wm.join() nicht nur für bestimmte Arbeiten nicht warten abgeschlossen sein , aber für ALLE Arbeiten, die von ALLEN Threads gestartet wurden. Schließlich wird "other code" ausgeführt, wenn jede einzelne Arbeit in der App abgeschlossen ist.

Ist es so, wie es sein sollte? Wenn ja, kann ich es beheben, so dass jeder wm.join() wartet nur auf "es" funktioniert zu tun?

WAS-Version ist 8.5.5.11

Vielen Dank!

Antwort

3

Gemäß dem dokumentierten Verhalten von WorkManager sollte es auf die Elemente in der bereitgestellten Liste warten.

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

Insbesondere wird JOIN_AND definiert als „Diese Konstante für den ANDOR Parameter der Join-Methode verwendet wird, um anzuzeigen, dass das Verfahren für alle Workitem in der Liste abzuschließen wartet beitreten sollte.“

Das von Ihnen beschriebene Verhalten klingt wie ein Fehler, und ich werde prüfen, ob ich dasselbe reproduzieren kann.

Ich werde auch erwähnen, dass für den Fall, dass sich dieses Verhalten als fehlerhaft erweist und Sie es ersetzen müssen, ein Ansatz ist, einen WorkListener zu registrieren, der ein java.util.concurrent.CountDownLatch dekrementiert, was Sie von Ihrem Einreicherthread erwarten können.

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(); 

Alternativ kann, wenn Sie in der Lage sind für Java EE 7 Unterstützung für WS v9 zu bewegen, es klingt wie das, was Sie wirklich wollen, ist javax.enterprise.concurrent.ManagedExecutorService.invokeAll(), die die kombinierte hat & Warte einreichen Verhalten eingebaut.

+0

danke, wirklich hilfreich! – SergeiK

Verwandte Themen