将无状态 Bean 注入可运行的 ScheduledExecutorService



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

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

然后我正在使用ScheduledExecutorService,并在部署后启动过程。

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

上面的 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);
}
}
}

我无法通过注入上述可运行的类来获取 findALL() 方法。 调度程序工作正常,但当它到达时它会失败carList = carService.findAll();事实上它在javax.persistence.criteria.CriteriaQuery cq = em.getCriteriaBuilder().createQuery();

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

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

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

正如您链接的第一个问题的答案中明确显示的那样,只需将@Schedule使用@Startup注释的@SingletonSessionBean,以确保它在服务器启动或部署应用程序时运行。

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

链接答案:

使用计时器在 JSF 管理的 Bean 中为定时任务生成线程

相关内容

  • 没有找到相关文章

最新更新