Websphere WorkManager 加入多个线程
Websphere WorkManager join for many threads
我有一个以某种方式启动的 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()
只等待 "its" 工作完成?
WAS版本为8.5.5.11
谢谢!
根据 WorkManager 记录的行为,它应该等待提供的列表中的项目。
具体来说,
JOIN_AND 定义为 "This constant is used for the ANDOR parameter of the join method to indicate that the join method should wait for all work items in the list to complete."
您描述的观察到的行为听起来像是一个错误,我会研究确认是否可以重现相同的行为。
我还要提到的是,如果这种行为确实存在错误并且您需要替换它,一种方法是使用注册一个 WorkListener 来递减 java.util.concurrent.CountDownLatch,这您可以在提交者线程中等待。
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(),它具有组合的提交和等待行为英寸
我有一个以某种方式启动的 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()
只等待 "its" 工作完成?
WAS版本为8.5.5.11
谢谢!
根据 WorkManager 记录的行为,它应该等待提供的列表中的项目。
具体来说, JOIN_AND 定义为 "This constant is used for the ANDOR parameter of the join method to indicate that the join method should wait for all work items in the list to complete."
您描述的观察到的行为听起来像是一个错误,我会研究确认是否可以重现相同的行为。
我还要提到的是,如果这种行为确实存在错误并且您需要替换它,一种方法是使用注册一个 WorkListener 来递减 java.util.concurrent.CountDownLatch,这您可以在提交者线程中等待。
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(),它具有组合的提交和等待行为英寸