当前位置: 首页 > 面试题库 >

Java EE 7-注入到Runnable / Callable对象

公冶子琪
2023-03-14
问题内容

Java EE 7中引入了并发实用程序(JSR 236)。

有什么方法可以将我的EJB注入Runnable / Callable对象吗?

具体来说,我想要这样的东西:

带有业务逻辑的ejb

@LocalBean
public class MyEjb {
    public void doSomeStuff() {
        ... do some stuff ...
    }
}

我想在其中注入MyEjb实例的可运行/可调用类

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字段始终为null。我想那里可以帮助JNDI查找,但是有什么合适的方法怎么做呢?


问题答案:

您必须给容器一个将EJB注入Task实例的机会。您可以使用以下代码中的动态实例来做到这一点:

@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);
    }
}

因为您不是使用new运算符而是通过CDI的实例机制创建实例,所以容器在调用时会准备MyTask的每个实例myTaskInstance.get()



 类似资料:
  • 问题内容: 我已经了解了Java 和接口之间的区别。从Java 1.5开始,已将其他功能添加到接口,并已调用这些功能以保持向后兼容性。 我的问题是,现在我们有了接口,我们应该一直使用吗?不使用和使用的用例是什么? 问题答案: 两者都有其用途,并且都由java.util.concurrent中的Executor框架支持。Runnable已经存在了更长的时间,但是它仍然在使用并且不被阻止。 可调用程序

  • 在Java中设计并发线程时,使用和接口有什么区别,为什么要选择其中一个?

  • 本文向大家介绍Java中Runnable和Callable接口之间的区别,包括了Java中Runnable和Callable接口之间的区别的使用技巧和注意事项,需要的朋友参考一下 可运行和可调用两个功能接口。实现这些接口的类设计为由另一个线程执行。 可以使用Ruunable启动线程,这是启动新线程的两种方法:一种是通过子类化Thread类,另一种是实现Runnable接口。 线程类没有可调用的构造

  • 本文向大家介绍实现Runnable接口和Callable接口的区别?相关面试题,主要包含被问及实现Runnable接口和Callable接口的区别?时的应答技巧和注意事项,需要的朋友参考一下 如果想让线程池执行任务的话需要实现的Runnable接口或Callable接口。 Runnable接口或Callable接口实现类都可以被ThreadPoolExecutor或ScheduledThreadP

  • javaee7-samples 是一个项目用来演示 Java EE 7 各种新特性的示例,有超过 160 个示例程序,包括: batch/batchlet-simple batch/chunk-checkpoint batch/chunk-csv-database batch/chunk-csv-database.clean batch/chunk-exception batch/chunk-ma

  • 我想在部署完GlassFish之后运行一些进程。进程将每小时运行一次,它包含通过无状态bean CarService使用下面的findAll()从DB表中提取数据: 我怀疑持久性上下文在调用时没有正确加载。 我遵循了以下问题使用计时器在JSF托管bean中为计划任务生成线程 调度作业上的scheduledExecutorService,timerService和无状态EJB