与 RequestScope 链接的本地线程
Local Thread linked with RequestScope
我有一个使用 CDI(焊接 2.1.2.Final)的 VRaptor 构建的 Web 服务。我需要并行化服务器所做的一些处理(工业警报的统计分析)。我正在使用 ExecutorService 和 Callable 实例来执行此操作,不幸的是,我的线程中需要一个 Request Scoped 依赖项。由于这种依赖,我面临这个错误:
WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped
有没有办法 link 使用 CDI 创建请求的线程?
*我知道我不应该在服务器中打开线程,但这是目前最可行的选择
将其作为可调用对象的构造函数参数传递。
public class YourTask implements Callable<String> {
private YourData data;
public YourTask(YourData data) {
this.data = data;
}
@Override
public String call() {
// Just use data.
}
}
@Inject
private YourRequestScopedBean bean;
public void submit() {
YourTask task = new YourTask(bean.getData());
// ...
}
注意:不要传递 bean 本身,因为它基本上是一个 proxy,其实例在其他线程中不存在。
另请参阅:
- FacesContext.getCurrentInstance() returns null in Runnable class
与具体问题无关,手动管理 Java EE 容器中的线程,即使是通过正确编程的 ExecutorService
完成,皱眉之上。这表明您不知道 Java EE 的 EJB 调度和计时器 API 的可能性。您可能会发现此答案中的示例很有用:Is it safe to start a new thread in a JSF managed bean?
我有一个使用 CDI(焊接 2.1.2.Final)的 VRaptor 构建的 Web 服务。我需要并行化服务器所做的一些处理(工业警报的统计分析)。我正在使用 ExecutorService 和 Callable 实例来执行此操作,不幸的是,我的线程中需要一个 Request Scoped 依赖项。由于这种依赖,我面临这个错误:
WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped
有没有办法 link 使用 CDI 创建请求的线程?
*我知道我不应该在服务器中打开线程,但这是目前最可行的选择
将其作为可调用对象的构造函数参数传递。
public class YourTask implements Callable<String> {
private YourData data;
public YourTask(YourData data) {
this.data = data;
}
@Override
public String call() {
// Just use data.
}
}
@Inject
private YourRequestScopedBean bean;
public void submit() {
YourTask task = new YourTask(bean.getData());
// ...
}
注意:不要传递 bean 本身,因为它基本上是一个 proxy,其实例在其他线程中不存在。
另请参阅:
- FacesContext.getCurrentInstance() returns null in Runnable class
与具体问题无关,手动管理 Java EE 容器中的线程,即使是通过正确编程的 ExecutorService
完成,皱眉之上。这表明您不知道 Java EE 的 EJB 调度和计时器 API 的可能性。您可能会发现此答案中的示例很有用:Is it safe to start a new thread in a JSF managed bean?