我有一个使用VRaptor构建的web服务,它使用CDI (焊缝2.1.2.Final)。我需要并行一些由服务器进行的处理(工业警报的统计分析)。我使用的是ExecutorService和可调用实例,不幸的是,我需要线程中的一个请求作用域依赖。由于这种依赖,我面临着这样的错误:
WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped有没有一种方法可以将线程链接到使用CDI创建它们的请求?
*我知道我不应该在服务器中打开线程,但这是目前最可行的选择
发布于 2016-01-17 09:26:09
将其作为可调用的构造函数参数传递。
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,它的实例在其他线程中不存在。
另请参阅:
与具体问题无关的(手工管理Java容器中的线程),即使是通过适当编程的ExecutorService完成的,也会受到反对。这表明您不知道Java的EJB调度和计时器API的可能性。您可能会发现这个答案中的示例很有用:Is it safe to start a new thread in a JSF managed bean?
https://stackoverflow.com/questions/34815608
复制相似问题