gpt4 book ai didi

multithreading - CDI 多线程

转载 作者:行者123 更新时间:2023-12-03 13:14:38 25 4
gpt4 key购买 nike

我们想优化我们的应用程序。有一些线性工作正在进行,可以在具有较小工作集的多个线程中执行。

使用 @Inject 访问我们的典型服务来自我们 CDI 管理的 bean 中的注释。这样的服务也可以注入(inject)它自己的依赖项,即:

public class MyService {

@Inject
private OtherService otherService;

@Inject
private DataService1 dataService1;

...

public void doSomething() {
...
}
}

因为我不能用 @Inject在实现 Runnable 的类内部. (它不是容器管理的。)我尝试在启动线程之前将所需的服务传递给类。所以,使用这样的东西,使服务实例( myService )在线程中可用:
Class Thread1 implements Runnable{
private MyService myService

public Thread1(MyService myService){
this.myService = myService;
}

public void run(){
myService.doSomething();
}
}

在调用层次结构之后调用 doStometing()很好,因为对 myService 的引用已通过。据我了解 CDI,注入(inject)是在第一次访问属性时完成的,也就是说,当 doStomething()方法尝试访问 otherServicedataService1 ,将执行注入(inject)。

但是,那时我收到一个异常,即没有可用的上下文。

我也尝试使用 JBossThreadExecuter类而不是普通线程 - 它导致完全相同的结果。

所以问题是,是否有一种很好的方法可以将上下文(或请求)与创建的 Thread 关联起来。 ?

对于 EJB-Beans,我读到用 @Asynchronous 标记方法将导致该方法在托管线程中运行,该线程本身将连接到上下文。这基本上正是我正在寻找的。

有没有办法在 CDI 中做到这一点?

或者有什么方法可以获得 context从非托管线程中?

最佳答案

Weld 允许程序化上下文管理,(there's an example in the official docs).

但在你走这条路之前,给 EJB 一个机会)
@Async 调用功能完全适合您的情况。作为奖励,您将获得超时拦截和事务管理。

关于multithreading - CDI 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21284191/

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