Как инъекция CDI работает в MDB и бинах @Scheduled? - PullRequest
3 голосов
/ 07 января 2011

Я работаю над большим приложением 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.

1 Ответ

0 голосов
/ 09 января 2011

Это может помочь явно определить зависимости с помощью проприетарной аннотации JBoss @Depends или с помощью файла jboss.xml.

См. Этот вопрос несколько схожий: Как заказать развертывание EJBи конфигурация очереди JMS в JBoss 5?

...