【发布时间】:2013-05-09 15:43:31
【问题描述】:
我们正在 Tomcat 上使用 JSF 2 和 Weld Cdi 开发 Web 前端。
现在我在并行执行多个 Web 服务以优化请求时间时遇到问题。
用户可以从列表中选择多个项目。
对于每个选定的项目,该过程使用列表键作为参数从一个 Web 服务收集它的信息。
我目前的方法是使用生产者,它返回注入到 bean 中的 web 服务端口接口。 bean 在循环中为每个选定的键调用此 webservie。
@Inject
private WSAnzeigeAssetsummen serviceAccess;
:
for ( Integer pfNr : sessionKeys.getPfnrList() ) {
summaryTable = serviceAccess.execute(snr, pfnr, requestType, "", desiredRows, userName);
processResult(summaryTable):
}
为了更快,我尝试使用 ExecutorService 和尽可能多的工人,它们正在返回期货。
这个结构的问题是,我不能将服务端口注入到工作进程中,因为这个工作进程没有被管理。手动创建服务端口,有效但不受欢迎,因为它忽略了生产者类。
此外,在测试时,也不能注入提供预定义结果集的虚拟服务端口。
由于我没有找到任何关于在 tomcat-weld 环境中并行执行的内容,所以我的方法一定有问题。
解决这种情况的正确方法是什么?
编辑:为了更清楚我尝试了什么......
public class DataCollector implements ISumRequest<Integer, Integer, String, FutureResult> {
ExecutorService pool = Executors.newCachedThreadPool();
@Inject
SessionBean sessionBean;
public Future<FutureResult> collectInformation(Integer snr, Integer pfnr, String requestType) {
CollectWorker worker = new CollectWorker (snr,pfnr,requestType,sessionBean.getUserName());
return pool.submit(worker);
}
}
这样做时,工人不受管理。
【问题讨论】:
-
这里肯定没有足够的代码来弄清楚发生了什么。为什么不管理工人?
-
好的,我添加了一些代码来解释我试图做什么。希望这能让它更清楚。我不知道如何动态创建托管实例。
-
这就是让我切换到 OWB 而不是焊接的原因,因为我可以使用非常流畅的 CdiControl 来解决这些问题。 struberg.wordpress.com/2012/03/17/…issues.apache.org/jira/browse/DELTASPIKE-284
标签: java parallel-processing cdi weld