Я хочу запустить некоторый процесс сразу после развертывания Glassfish. Процесс будет проходить через каждый час, и он содержит выборки данных из БДА таблиц через безгосударственную фасоль CarService с FindAll() ниже:Внедрение компонента без гражданства в runnable для ScheduledExecutorService
@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
OK я могу с контейнером удалось «@Schedule» вместо ** ScheduledExecutorService **, но теперь я должен решать с конфигурацией таймера GlassFish, который является болезненным, потому что ему отвечает ** «Информация: нет таймеров EJB, принадлежащих этому серверу Информация: <== Таймеры восстановлены.» ** Это причина, по которой я пытался использовать ** ScheduledExecutorService **, который будет запускать процесс с фиксированной скоростью, получая runnable реализация. Есть ли способ подключить/внедрить мой EntityManager в runnable? –
Нет, вы не можете внедрить EntityManager в класс, не управляемый контейнером, и вам следует избегать управления задачами самостоятельно. Что касается настройки таймера в Glassfish, это хороший момент, но это также совершенно новый вопрос. Откройте новый вопрос. – perissf
спасибо за подсказку. Я проверил мой сущ. менеджер с планировщиком и отлично работает. этот планировщик аналогичен ScheduledExecutorService ?? означает, что задачи будут выполняться асинхронно рабочим потоком, а не потоком, передающим задачу Планировщику. в противном случае мне нужно снова управлять всеми последующими задачами, используя ScheduledExecutorService для каждого элемента ArrayList от EntityManager –