Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaEE7-注入可运行/可调用对象_Java_Concurrency_Dependency Injection_Java Ee 7 - Fatal编程技术网

JavaEE7-注入可运行/可调用对象

JavaEE7-注入可运行/可调用对象,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

JavaEE7中引入了并发实用程序(JSR236)

有没有办法将我的EJB注入到可运行/可调用对象中

我特别想要这样的东西:

具有业务逻辑的ejb

@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;”?为什么我需要使用实例对象?