3

大家好,我是论坛的新手,我刚刚有一个关于使用 Spring 的 commonj WorkManagerTaskExecutor 的问题。我一直在一堆论坛上寻找有关该主题的更好信息,但我没有看到有关该主题的任何详细信息。所以这是我的情况。

我的应用程序使用由 ThreadPoolTask​​Executor 处理的多个线程,一位朋友告诉我他认为这不是正确的选择,因为我们使用的是 websphere 7.0 应用程序服务器。我让一切正常工作,并且通过一些小的调整能够用 WorkManagerTaskExecutor 替换 ThreadPoolTask​​Executor。当我运行应用程序时,线程会通过 websphere 服务器上的默认工作管理器启动。似乎正在发生的问题是,即使我正在使用 workManagerTaskExecutor.waitForAll(collection,timeout); 它实际上从不等待线程完成。我知道线程正在执行它们各自的方法是有效的,因为如果你在所有这些之后发出一个冗长的 for 循环,那么数据就在那里,就好像你没有数据不在那里一样。

  1. WorkManagerTaskExecutor 是要走的路吗?或者使用 ThreadPoolTask​​Executor 是否足以处理企业 Web 应用程序上的多个线程?

  2. 如果 WorkManagerTaskExecutor 是要走的路?关于为什么 waitForAll 方法像方法完成一样完成的任何想法?什么时候明显不是?页面加载后,我可以在日志中看到这些方法仍在运行并最终完成。

任何帮助将非常感激。如果我遗漏了任何内容,我将很乐意尝试提供有关该问题的更多信息,因为我非常感谢可能提供的任何帮助。

提前致谢,

账单

4

2 回答 2

3

您应该通过扩展 JavaSE 内置的java.util.concurrent.Executor接口来实现您的并发类,然后使用Spring IoC 容器,您可以在 Websphere 下运行时注入WorkManagerTaskExecutor的实现类。

如果您想在另一个 Java 应用程序服务器上运行,这将为您提供灵活性,即使您在 JVM 上直接在容器外运行,也可以工作,因为您可以注入ThreadPoolTask​​Executor而不必更改任何代码。

您应该避免直接针对 CommonJ WorkManager API (JSR 237) 进行编码,例如使用该waitForAll方法,因为它仅适用于 IBM Websphere 和 Oracle WebLogic。

于 2012-05-12T02:08:58.637 回答
0

对我来说,这个问题的最终获胜组合最终是:

List<Callable<?>> callables = new ArrayList<Callable<?>>();
    List<Future<?>> futures = new ArrayList<Future<?>>();
    for (int i = 0; i<callers.length;i++){
        callables.add(new MainTaskExecutor(this,entity,callers[i]));

    }
    for (Callable c:callables){
        futures.add(workTaskExecutor.submit(c));
    }
    for (Future<?> f:futures){
        do{}while(!f.isDone());
    }
于 2012-05-14T18:24:41.070 回答