Java CDI ConversationScope путем вызова таймера?

Мы запускаем среду JavaEE 6 с EclipseLink и JBoss Weld. Для EntityManager мы в настоящее время используем область @ConversationScoped, и она очень хорошо работает для взаимодействий JSF.

Теперь мы хотим включить метод @Schedule для некоторой автоматической проверки данных (проверка сроков и т. Д.). Тем не менее, я не знаю, возможно ли это вообще, так как автоматический вызов не создает разговора. В настоящее время это наш подход:

@Stateless
public class Scheduler

  @Inject
  private CampaignService campaignService; 
    // CampaignService is @ApplicationScoped and uses an EntityManager

  @Schedule(second="*/3", ...)
  public void checkDeadlines(){
    campaignService.getAll() // fetches all campaigns from EntityManager
    ...
  }

}

Однако внедрение не работает до тех пор, пока EntityManager имеет значение @ConversationScoped. (ContextNotActiveException)

Есть ли возможность "создать" разговор, кроме как с помощью вызова JSF? Или это единственная возможность создания настраиваемой области, как в разделе Как использовать CDI-@SessionScoped без http-сессии?

1 ответ

Решение

Если вы собираетесь использовать планировщики, лучшее решение - использовать @PersistenceContext чтобы получить EntityManager. Другой вариант заключается в том, чтобы не использовать менеджер сущностей в области диалога (который в любом случае следует считать плохой практикой), а также использовать диспетчер сущностей в области по умолчанию или запрашивать.

Я говорю, что управление объектами в области диалога - плохая практика, потому что оно может легко привести к проблемам с отложенной инициализацией, отсоединенным объектам и утечкам памяти.

Другие вопросы по тегам