Websphere WorkManager加入了许多线程

时间:2017-03-23 12:30:48

标签: java multithreading asynchronous websphere workmanagers

我有一个WM以某种方式开始工作:

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

谢谢!

1 个答案:

答案 0 :(得分: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,你可以等待你的提交者线程。

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

或者,如果您能够转移到WAS v9以获得Java EE 7支持,那么听起来您真正想要的是javax.enterprise.concurrent.ManagedExecutorService.invokeAll(),它具有组合提交&amp;内置的等待行为。