Jsf 将无状态bean注入ScheduledExecutorService的runnable中

Jsf 将无状态bean注入ScheduledExecutorService的runnable中,jsf,jakarta-ee,ejb,executorservice,Jsf,Jakarta Ee,Ejb,Executorservice,我想在Glassfish部署之后运行一些进程。进程将每小时运行一次,它包含通过以下带有findAll()的无状态bean CarService从DB表获取数据: 上面的ScheduleTask()包含包含业务逻辑的流程,例如: public class ScheduleTask implements Runnable { @Inject CarService carService; private volatile ScheduledExecutorService sc

我想在Glassfish部署之后运行一些进程。进程将每小时运行一次,它包含通过以下带有findAll()的无状态bean CarService从DB表获取数据:

上面的ScheduleTask()包含包含业务逻辑的流程,例如:

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);
            }
        }
    }
公共类ScheduleTask实现可运行{
@注入
汽车服务;
私有易失性ScheduledExecutorService调度程序=null;
@凌驾
公开募捐{
System.out.println(“调用scheduletask”);
List carList=new ArrayList();
carList=carService.findAll();
if(carList!=null){
用于(汽车:carList){
系统输出打印(car);
}
}
}
我无法通过注入上述可运行类来获得findALL()方法。调度器工作正常,但在到达
carList=carService.findALL();
时失败,实际上它在
javax.persistence.criteria.CriteriaQuery cq=em.getCriteriaBuilder().createQuery();

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

我已跟进以下问题


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

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

链接答案:


好的,我可以用容器管理的'@Schedule'代替ScheduledExecutorService,但现在我必须处理glassfish的计时器配置,这很痛苦,因为它正在回复“信息:此服务器没有EJB计时器信息:不,您不能将EntityManager注入到非容器管理的类中,并且uld避免自己管理任务。关于如何在Glassfish中配置计时器,这是一个很好的观点,但这也是一个全新的问题。打开一个新问题。感谢您的提示。我已使用调度器测试了entitymanager,效果良好。此调度器与ScheduledExecutorService相同??意味着任务将通过工作线程异步执行er线程,而不是将任务交给调度程序的线程。否则,我必须使用EntityManager中的ScheduledExecutorService为ArrayList的每个元素重新管理所有后续任务幸运的是,我对ScheduledExecutorService不太感兴趣,老实说,从您的评论中,我无法理解问题出在哪里。您真的应该在新问题中设置mvce吗
@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);
            }
        }
    }