我们正在使用JSF2和Weld Cdi在Tomcat上开发Web前端。
现在,我在并行执行多个the服务以优化请求时间时遇到了问题。
用户可以从列表中选择多个项目。
对于每个选定的项目,该流程使用list键作为参数从一个key服务收集其信息。
我目前的方法是使用一个生产者,它返回注入到bean中的bean服务端口接口。对于每个选定的键,bean在循环中调用此webservie。
@Inject
private WSAnzeigeAssetsummen serviceAccess;
:
for ( Integer pfNr : sessionKeys.getPfnrList() ) {
summaryTable = serviceAccess.execute(snr, pfnr, requestType, "", desiredRows, userName);
processResult(summaryTable):
}为了获得更快的速度,我尝试使用ExecutorService和所需的任何数量的工作程序,这些工作程序将返回未来。
这个结构的问题是,我不能将服务端口注入worker,因为worker不是托管的。手动创建服务端口是可行的,但并不受欢迎,因为它忽略了生产者类。
此外,在测试时,不可能注入一个提供预定义结果集的虚拟服务端口。
因为我没有找到任何关于在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);
}}
当这样做时,工人不是被管理的。
发布于 2013-05-15 22:56:40
您可以将创建的worker包装在CDI创建上下文中,如下所示:
@Inject
private BeanManager beanManager;
public <T extends Object> T performInjection(final T obj) {
if (this.beanManager != null) { // only do injection if the bean manager is present.
// Create a creational context from the BeanManager
final CreationalContext creationalContext = this.beanManager.createCreationalContext(null);
// Create an injection target with the Type of the instance we need to inject into
final InjectionTarget injectionTarget = this.beanManager.createInjectionTarget(this.beanManager.createAnnotatedType(obj.getClass()));
// Perform injection into the instance
injectionTarget.inject(obj, creationalContext);
// Call PostConstruct on instance
injectionTarget.postConstruct(obj);
}
return obj;
}https://stackoverflow.com/questions/16558785
复制相似问题