Я работаю над большим приложением Java EE 6, которое развернуто на JBoss 6 Final. Мои текущие задачи включают постоянное использование @Inject вместо @EJB, но я сталкиваюсь с некоторыми проблемами на некоторых типах bean-компонентов, в частности на bean-компонентах @MessageDriven и bean-компонентах с методами @Scheduled.
Что происходит, если мне не повезло с синхронизацией (для @Schedule) или если при запуске есть сообщения в очередях MDB, создание экземпляров bean-компонентов завершится неудачно, потому что внедренные ресурсы (которые сами являются EJB) еще не связаны
Поскольку я использую @Inject, я предполагаю, что контейнер EJB считает мои компоненты готовыми, так как сам контейнер не заботится о @Inject; Вероятно, это просто предполагает, что, поскольку инъекций @EJB нет, компоненты готовы к использованию. В этом случае внедренные прокси-серверы CDI потерпят неудачу, поскольку ресурсы для внедрения еще не связаны.
Крошечный пример:
@Stateless
@LocalBean
public class MySupportingBean {
public void doSomething() {
...
}
}
@Singleton
public class MyScheduledBean {
@Inject
private MySupportingBean supportingBean;
@Schedule(second = "*/1", hour = "*", minute = "*", persistent = false)
public void onTimeout() {
supportingBean.doSomething();
}
}
Приведенный выше пример, вероятно, не будет часто терпеть неудачу, потому что есть только два bean-компонента, но проект, над которым я работаю, связывает множество EJB-компонентов, что усилит проблему. Но это может произойти сбой, потому что нет гарантии, что MySupportingBean будет привязан первым, и если onTimeout вызывается до того, как MySupportingBean будет привязан, то создание экземпляра MyScheduledBean завершится неудачно. Если бы вместо этого я использовал @EJB, MyScheduledBean не будет привязан, пока не будет удовлетворена зависимость от MySupportingBean.
Обратите внимание, что в примере не произойдет сбой в самом onTimeout, но когда CDI пытается внедрить MySupportingBean.
Я читал много постов на разных форумах, где многие утверждают, что @Inject всегда лучше. В общем, я согласен, но как они обрабатывают @Schedule или @MessageDriven в сочетании с @Inject? По моему опыту, все зависит от того, сработают ли bean-компоненты в этих случаях или нет, и bean-компоненты будут работать произвольно, в зависимости от того, в каком порядке развернуты EJB, и когда вызываются @Schedule или onMessage.