JavaEE7-注入可运行/可调用对象
JavaEE7中引入了并发实用程序(JSR236) 有没有办法将我的EJB注入到可运行/可调用对象中 我特别想要这样的东西: 具有业务逻辑的ejbJavaEE7-注入可运行/可调用对象,java,concurrency,dependency-injection,java-ee-7,Java,Concurrency,Dependency Injection,Java Ee 7,JavaEE7中引入了并发实用程序(JSR236) 有没有办法将我的EJB注入到可运行/可调用对象中 我特别想要这样的东西: 具有业务逻辑的ejb @LocalBean public class MyEjb { public void doSomeStuff() { ... do some stuff ... } } 我想在其中注入MyEjb实例的runnable/callable类 public class MyTask implements Runnable
@LocalBean
public class MyEjb {
public void doSomeStuff() {
... do some stuff ...
}
}
我想在其中注入MyEjb实例的runnable/callable类
public class MyTask implements Runnable {
@EJB
MyEjb myEjb;
@Override
public void run() {
...
myEjb.doSomeStuff();
...
}
}
启动新任务的对象
@Singleton
@Startup
@LocalBean
public class MyTaskManager {
@Resource
ManagedExecutorService executor;
@PostConstruct
void init() {
executor.submit(new MyTask());
}
}
MyTask中的myEjb字段始终为空。我想这可能有助于JNDI查找,但是有没有合适的方法可以做到这一点呢?如果MyTask实例是由您创建的,那么EJB就不能被注入,因为容器只知道自己创建的实例。相反,您可以将EJB注入MyTaskManager Singleton SB中,并将MyTask可运行类定义为innerclass,如下所示:
@Singleton
@Startup
@LocalBean
public class MyTaskManager {
@Resource
ManagedExecutorService executor;
@EJB
MyEjb myEjb;
@PostConstruct
void init() {
executor.submit(new MyTask());
}
class MyTask implements Runnable {
@Override
public void run() {
...
myEjb.doSomeStuff();
...
}
}
}
您必须给容器一个将EJB注入任务实例的机会。您可以使用以下代码中的动态实例来实现这一点:
@Stateless
public class MyBean {
@Resource
ManagedExecutorService managedExecutorService;
@PersistenceContext
EntityManager entityManager;
@Inject
Instance<MyTask> myTaskInstance;
public void executeAsync() throws ExecutionException, InterruptedException {
for(int i=0; i<10; i++) {
MyTask myTask = myTaskInstance.get();
this.managedExecutorService.submit(myTask);
}
}
@无状态
公共类MyBean{
@资源
ManagedExecutorService ManagedExecutorService;
@持久上下文
实体管理器实体管理器;
@注入
实例myTaskInstance;
public void executeAsync()引发ExecutionException、InterruptedException{
对于(int i=0;i仔细观察一下,似乎您应该可以这样做。例如:。但正如在另一条评论中所说的,您需要让服务器处理任务创建。它给出了“org.jboss.weld.exceptions.UnsatisfiedResolutionException:weld-001308:无法解析类型的任何bean…” Exception@ravthiru-您需要确保您传递的bean由容器管理。例如,在声明类之前添加“@ManagedBean”。我仍然从我的身边收到一个不满意的解决方案异常。请您解释一下为什么这样做:“@InjectInstance myTaskInstance;”,但这不起作用:“@InjectMyTaskInstance;”?为什么我需要使用实例对象?