2017-03-23 5 views
1

I가 어떤 방법으로 일을 시작 하나 WM :스피어 WorkManager 많은 스레드에 가입

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()은 "its"작업 만 완료되기를 기다립니다.

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로 정의되는 "이 정수가 결합 방법은,리스트 완료 모든 작업 항목 기다리는 것을 표시하기 위해 가입 방법의 ANDOR 변수에 사용된다."

당신이 묘사 한 행동은 버그처럼 들리지만 나는 똑같은 것을 재현 할 수 있는지 확인해 보겠습니다.

이 동작이 버그가있어 교체해야하는 경우 한 가지 방법은 java.util.concurrent.CountDownLatch를 감소시키는 WorkListener를 등록하는 것입니다. 제출자 스레드에서 기다릴 수 있습니다. 자바 EE 7 지원 WAS 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