大家好,我是论坛的新手,我刚才有一个关于使用Spring的commonj WorkManagerTaskExecutor的问题。我一直在一堆论坛上寻找关于这个主题的更好的信息,但我没有看到关于这个主题的任何详细信息。所以这是我的情况。
我的应用程序使用由ThreadPoolTaskExecutor处理的多个线程,朋友告诉我,他认为这不是正确的选择,因为我们使用的是websphere 7.0应用服务器。我让一切正常工作,并通过一些小调整能够用WorkManagerTaskExecutor替换ThreadPoolTaskExecutor。当我运行应用程序时,线程将通过websphere服务器上的默认工作管理器触发。似乎正在发生的问题是,即使我使用的是workManagerTaskExecutor.waitForAll(collection,timeout);它实际上从未等待线程完成。我知道它正在工作,即线程正在执行它们各自的方法,因为如果你在所有这些之后发出一个冗长的for循环,那么数据就好像你没有数据那样。我想知道以下两件事。
WorkManagerTaskExecutor是否可行?或者使用ThreadPoolTaskExecutor是否足以处理企业Web应用程序上的多个线程?
如果要使用WorkManagerTaskExecutor?有关为什么waitForAll方法完成的任何想法,就像方法完成一样?什么时候他们不是?页面加载后,我可以在日志记录中看到方法仍在运行并最终完成。
非常感谢任何帮助。如果我遗漏了任何东西,我会很乐意尝试提供有关该问题的更多信息,因为我真的很感激可能给予的任何帮助。
先谢谢,
比尔
答案 0 :(得分:3)
您应该通过扩展JavaSE中内置的java.util.concurrent.Executor接口来实现并发类,然后使用Spring IoC container,在Websphere下运行时可以注入实现类WorkManagerTaskExecutor。
如果您想在另一个Java应用服务器上运行,这将为您提供灵活性,如果您直接在JVM上运行容器,甚至可以工作,因为您可以注入ThreadPoolTaskExecutor而不必更改任何代码。
您应该避免直接使用CommonJ WorkManager API(JSR 237)进行编码,例如使用waitForAll
方法,因为它只适用于IBM Websphere和Oracle WebLogic。
答案 1 :(得分: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());
}