当前位置: 首页 > 知识库问答 >
问题:

将无状态bean注入runnable for ScheduledExecutorService

蓬宾白
2023-03-14

我想在部署完GlassFish之后运行一些进程。进程将每小时运行一次,它包含通过无状态bean CarService使用下面的findAll()从DB表中提取数据:

@PersistenceContext
private EntityManager em;

public List<Cars> findAll() {
    javax.persistence.criteria.CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
    cq.select(cq.from(Cars.class));
    return em.createQuery(cq).getResultList();
}
@ManagedBean(eager=true)
@ApplicationScoped
public class ApplicationStateChange {

private ScheduledExecutorService scheduler;

@PostConstruct
public void init() {
    System.out.println("ejb init method called");
    scheduler = Executors.newScheduledThreadPool(2);
    scheduler.scheduleAtFixedRate(new ScheduleTask();, 15, 30, TimeUnit.SECONDS);
}

@PreDestroy
    public void destroy() {
        /* Shutdown stuff here */
        System.out.println("ejb destroy method called");
        scheduler.shutdownNow();
    }
public class ScheduleTask implements Runnable {

    @Inject
    CarService carService;
    private volatile ScheduledExecutorService scheduler = null;

    @Override
    public void run() {
        System.out.println("scheduletask is called");
        List<Car> carList = new ArrayList<>();
               carList = carService.findAll();
        if (carList != null) {
            for (Car car : carList) {
                System.out.println(car);
            }
        }
    }

我怀疑持久性上下文在调用时没有正确加载。

我遵循了以下问题使用计时器在JSF托管bean中为计划任务生成线程

调度作业上的scheduledExecutorService,timerService和无状态EJB

共有1个答案

楚浩然
2023-03-14

正如您所链接的第一个问题的答案中清楚地揭示的那样,只需将@schedule使用到一个带有@startup注释的@singletonSessionBean,以确保它在服务器启动或部署应用程序时运行。

正如您正确提到的,EntityManager和PersistenceContext不能注入到非容器管理的类中(而Singleton SessionBean是一个托管类)。

链接答案:

使用计时器在JSF托管bean中为计划任务生成线程

 类似资料:
  • 我一直在研究很多类似的问题,这些问题并没有反映我的确切问题。如果我忽略了有人已经解决了这个问题,请让我知道。 我目前正在将JBoss 3.x上的旧EJB2.1应用程序迁移到JBoss 7.x上EJB3.x。由于应用程序客户端和服务器之间通信的变化,我创建了一个小的testclient来检查缺陷。 其中之一是我的无状态会话bean中的entitymanager没有被注入,使entitymanager

  • 无状态会话bean是一种企业bean,通常用于执行独立操作。 无状态会话bean根据其名称没有任何关联的客户端状态,但它可以保留其实例状态。 EJB容器通常会创建一个包含少量无状态bean对象的池,并使用这些对象来处理客户端的请求。 由于池,在查找/方法调用中不保证实例变量值相同。 创建无状态EJB的步骤 以下是创建无状态EJB所需的步骤 - 创建公开业务方法的远程/本地接口。 EJB客户端应用程

  • 我是EJB的新手,最近开始研究EJB(3.0)。我已经使用Java6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我可以在哪里实际应用一些概念。 在理解无状态会话bean后,我想到的一个问题是,你能不能不要总是用一个没有本地成员的类的共享实例来替换无状态会话bean(实际上使其无状态)?我了解到正在为无状态会话bean进行实例池。如果没有状态,就不能简单地使

  • 我一直在研究很多类似的问题,这些问题并没有反映我的确切问题。如果我忽略了有人已经解决了这个问题,请让我知道。 我目前正在Wildfly 10.1上将一个旧的EJB CMP bean迁移到JPA。这里的问题是我的无状态会话beans中的entitymanager没有注入@PersistenceContext,使EntityManager为空。我尝试使用EntityManagerFactory来解决这

  • 在我的microservice Spring Boot项目中,我用@ResponseStatus注释了这个自定义异常: 它工作得很好:当引发异常时,我的控制器返回指定的状态(404),但原因没有得到解决(错误消息是“${message.custom.notFound}”)。 您知道是否有方法将属性文件中的属性注入到此注释中吗? 提前感谢

  • 我有一个JSF的问题,CDI项目。我做了大量研究,发现在CDI中没有注释。我用对话框解决基于ajax的页面的问题。我想将变量从DataTable传递到dialog。为此,我不能使用bean,因为在请求结束后会丢弃值。有人能帮我解决吗?我不能使用,但这是一个糟糕的做法。或者只保存这一个变量到会话谁知道。你们能给我一些提示如何优雅地解决这个问题吗? 以下是错误消息: