gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:22:58 25 4
gpt4 key购买 nike

我们正在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com