2017-02-22 67 views
0

Я хочу запустить некоторый процесс сразу после развертывания 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

ответ

1

Как ясно подвергается в ответе на первый вопрос вы связаны, просто использовать @Schedule в @Singleton SessionBean с аннотацией @Startup для того, чтобы убедиться, что он работает, когда сервер запускается или приложение развертывается.

Как вы правильно указали, EntityManager и PersistenceContext не могут быть введены в класс, не связанный с контейнером (а Singleton SessionBean - это управляемый класс).

Linked Ответ:

Spawning threads in a JSF managed bean for scheduled tasks using a timer

+0

OK я могу с контейнером удалось «@Schedule» вместо ** ScheduledExecutorService **, но теперь я должен решать с конфигурацией таймера GlassFish, который является болезненным, потому что ему отвечает ** «Информация: нет таймеров EJB, принадлежащих этому серверу Информация: <== Таймеры восстановлены.» ** Это причина, по которой я пытался использовать ** ScheduledExecutorService **, который будет запускать процесс с фиксированной скоростью, получая runnable реализация. Есть ли способ подключить/внедрить мой EntityManager в runnable? –

+0

Нет, вы не можете внедрить EntityManager в класс, не управляемый контейнером, и вам следует избегать управления задачами самостоятельно. Что касается настройки таймера в Glassfish, это хороший момент, но это также совершенно новый вопрос. Откройте новый вопрос. – perissf

+0

спасибо за подсказку. Я проверил мой сущ. менеджер с планировщиком и отлично работает. этот планировщик аналогичен ScheduledExecutorService ?? означает, что задачи будут выполняться асинхронно рабочим потоком, а не потоком, передающим задачу Планировщику. в противном случае мне нужно снова управлять всеми последующими задачами, используя ScheduledExecutorService для каждого элемента ArrayList от EntityManager –