【问题标题】:Parallel webservices access in a Weld CDI environmentWeld CDI 环境中的并行 Web 服务访问
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 是的,这可能是你能做的最好的了。
  • 你能帮忙解释一下return container;吗?是return obj;的意思吗?
  • 已修复,我的本地示例中最后有一个错字。
  • @JohnAment。 obj@Dependent的范围是什么?如果是,取决于谁?
  • 在这种情况下,对象没有作用域,因为您实例化了它。进入对象的注入目标将取决于当时可用的内容 - 因此它可以具有请求范围内的目标等,如果这些目标是活动且可用的。
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 2017-10-31
  • 1970-01-01
相关资源
最近更新 更多