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. Другой вариант заключается в том, чтобы не использовать менеджер сущностей в области диалога (который в любом случае следует считать плохой практикой), а также использовать диспетчер сущностей в области по умолчанию или запрашивать.
Я говорю, что управление объектами в области диалога - плохая практика, потому что оно может легко привести к проблемам с отложенной инициализацией, отсоединенным объектам и утечкам памяти.