与 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?