【问题标题】:Websphere WorkManager join for many threadsWebsphere WorkManager 加入多个线程
【发布时间】:2017-03-23 12:30:48
【问题描述】:

我有一个以某种方式启动的 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" 会在 app 中的每一项工作完成后执行。

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

WAS 版本是 8.5.5.11

谢谢!

【问题讨论】:

    标签: java multithreading asynchronous websphere workmanagers


    【解决方案1】:

    根据 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 定义为“这个常量用于join方法的ANDOR参数,表示join方法应该等待列表中的所有工作项完成。”

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      相关资源
      最近更新 更多