gpt4 book ai didi

java - Websphere WorkManager 加入多个线程

转载 作者:行者123 更新时间:2023-11-29 04:33:08 24 4
gpt4 key购买 nike

我有一个以某种方式启动的 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() 不只等待给定的工作完成,而是等待所有所有线程已启动的工作。最终 “其他代码” 在应用程序中的每个工作完成时执行。

这是应该的方式吗?如果是这样,我能否修复它,让每个 wm.join() 只等待“它的”工作完成?

WAS版本为8.5.5.11

谢谢!

最佳答案

根据 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 参数,以指示连接方法应等待列表中的所有工作项完成。”

您描述的观察到的行为听起来像是一个错误,我会研究确认是否可以重现相同的行为。

我还要提到的是,如果这种行为确实存在错误并且您需要替换它,一种方法是使用注册一个 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(),它内置了组合的提交和等待行为。

关于java - Websphere WorkManager 加入多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42976127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com