【发布时间】:2017-02-22 09:53:34
【问题描述】:
我想在部署 Glassfish 之后运行一些进程。进程将每小时运行一次,它包含通过无状态 bean CarService 从 DB 表中获取数据,其中 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(); 失败了
我怀疑持久性上下文在调用时没有正确加载。
我关注了以下问题Spawning threads in a JSF managed bean for scheduled tasks using a timer
scheduledExecutorService, timerService and Stateless EJB on scheduled jobs
【问题讨论】:
标签: jsf jakarta-ee ejb executorservice