我有一个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
谢谢!
答案 0 :(得分:3)
根据WorkManager记录的行为,它应该等待提供列表中的项目。
具体而言, 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;内置的等待行为。