首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Weld CDI环境中的并行Weld服务访问

Weld CDI环境中的并行Weld服务访问
EN

Stack Overflow用户
提问于 2013-05-15 15:04:35
回答 1查看 379关注 0票数 1

我们正在使用JSF2和Weld Cdi在Tomcat上开发Web前端。

现在,我在并行执行多个the服务以优化请求时间时遇到了问题。

用户可以从列表中选择多个项目。

对于每个选定的项目,该流程使用list键作为参数从一个key服务收集其信息。

我目前的方法是使用一个生产者,它返回注入到bean中的bean服务端口接口。对于每个选定的键,bean在循环中调用此webservie。

代码语言:javascript
复制
@Inject
private WSAnzeigeAssetsummen serviceAccess;
:

for ( Integer pfNr : sessionKeys.getPfnrList() ) {
   summaryTable = serviceAccess.execute(snr, pfnr, requestType, "", desiredRows, userName);
   processResult(summaryTable):
}

为了获得更快的速度,我尝试使用ExecutorService和所需的任何数量的工作程序,这些工作程序将返回未来。

这个结构的问题是,我不能将服务端口注入worker,因为worker不是托管的。手动创建服务端口是可行的,但并不受欢迎,因为它忽略了生产者类。

此外,在测试时,不可能注入一个提供预定义结果集的虚拟服务端口。

因为我没有找到任何关于在tomcat-weld环境中并行执行的东西,所以我的方法一定有什么问题。

解决这种情况的正确方法是什么?

编辑:更清楚地说,我尝试了什么……

代码语言:javascript
复制
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);        
}

}

当这样做时,工人不是被管理的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-15 22:56:40

您可以将创建的worker包装在CDI创建上下文中,如下所示:

代码语言:javascript
复制
@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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16558785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档