Java EE 7 中的 CDI + 托管并发性

7

我正在实现一个应用程序范围的服务(将进一步注入到JAX-RS / JAX-WS服务或servlet中,无所谓),它将通过ManagedExecutorService或ManagedThreadFactory生成一些处理。在处理代码(Runnable实例)中,我想使用注入的资源,如EntityManager、DataSource和Web服务引用。第一个解决方案是这样的:

@ApplicationScoped
class MyService {

 @Resource private ManagedExecutorService mes;

 public void request(String param) {
  mes.submit(new MyTask(param));
 }

}

class MyTask implements Runnable {
 // constructor skipped
 @Resource private DataSource ds;

 public void run() {
  // do processing
 }

}

在MyTask.run()方法内,ds字段似乎为null。这是因为MyTask实例不是托管bean,即它不是由DI容器创建的,因此无法进行注入。让我们将直接实例化更改为上下文实例:

@ApplicationScoped
class MyService {

 @Resource ManagedExecutorService mes;
 @Inject private Instance<MyTask> instance;

 public void request(String param) { // <- no way to pass param to MyTask()!
  mes.submit(instance.get());
 }

}

这个方法可以实现预期的效果。但是,这是否是我想要的正确/最佳方式呢?通常,问题是如何在运行时按需创建注入/管理的实例。此外,在后一种情况下,我无法传递任何参数给MyTask构造函数 - 是否可能,还是必须引入MyTask.setParam()方法来配置MyTask实例?
1个回答

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接