java - Weld CDI 环境中的并行 Web 服务访问

标签 java parallel-processing cdi weld

我们正在 Tomcat 上使用 JSF 2 和 Weld Cdi 开发 Web 前端。
现在,我在并行执行多个 Web 服务以优化请求时间时遇到问题。
用户可以从列表中选择多个项目。
对于每个选定的项目,该过程使用列表键作为参数从一个 Web 服务收集其信息。

我当前的方法是使用 Producer,它返回 Web 服务端口接口(interface),该接口(interface)被注入(inject)到 bean 中。该 bean 在循环中为每个选定的键调用此 Web 服务。

@Inject
private WSAnzeigeAssetsummen serviceAccess;
:

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

为了更快,我尝试使用 ExecutorService 和所需数量的工作人员,这些工作人员返回 Futures。

这个构造的问题是,我无法将服务端口注入(inject)到工作线程中,因为工作线程不受管理。手动创建服务端口可以工作,但不受欢迎,因为它忽略了生产者类。

此外,在测试时,无法注入(inject)提供预定义结果集的虚拟服务端口。

由于我没有找到任何关于在 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);        
}

}

这样做时,工作人员不受管理。

最佳答案

您可以将创建的工作人员包装在 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;
}

关于java - Weld CDI 环境中的并行 Web 服务访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16558785/

相关文章:

java - 未调用带有@Named @ViewScoped 的@PostConstruct 拦截器

java - Gauge - 在 Java 的父类(super class)中运行 @BeforeSpec

java - 如何在折线图中设置左右 y 轴的填充

linux - XARGS、GREP 和 GNU 并行

C# 是否可以并行 foreach while 循环?

r - 所有 R 包的并行编程

java - 如何在具有多个服务器的同一数据库上使用 Camel JPA 组件?

java - 在散点图中查找位于 X 轴和 Y 轴附近的点

java - CDI 使用 @Produces 按字段名称注入(inject) EntityManager

java - 如何在 JavaEE [7] 中通过 [weld] API 在运行时实例化 CDI bean?