Подтвердить что ты не робот

Поиск времени для EJB в MDB, потребляющем сразу после развертывания

У меня есть проект Java EE 5 с использованием JBoss 5.1 и проблема вроде этого. Мне нужно выполнить поиск во время выполнения для некоторых EJB в MDB, используя строку, которая получается из содержимого сообщения. Это просто своего рода шаблон локатора сервисов, используемый в MDB. Теперь, поскольку MDB начинают потреблять сразу после развертывания, у меня много NameNotFoundException, так как неявный порядок развертывания здесь не работает (поиск во время выполнения). Что вы думаете об этом? Возможно ли это сделать с помощью EJB 3.0? Для меня также приемлемо использовать любые специфические для вендора вещи (JBoss 5.1), если это устраняет проблему.

Некоторые фрагменты кода для визуализации ситуации:

@MessageDriven(mappedName="jms/Queue")
public class MessageBean implements MessageListener {

    @Resource
    private MessageDrivenContext mdc;

    public void onMessage(Message msg) {

        final String beanName = // extract somehow the bean name from 'msg'
        final Context ctx = new InitialContext();
        final Object obj = ctx.lookup(beanName); // NameNotFoundException
        // do something with 'obj'
    }
}
4b9b3361

Ответ 1

Используйте один из четырех различных подходов.

  • Объявлять зависимости EJB (ссылки EJB) с помощью аннотации @EJB (не использовать JNDI-поиск). Для ссылок на объекты bean следует ссылаться на домашний интерфейс bean. Контейнер должен обеспечить ввод всех зависимостей перед обработкой/обработкой сообщений:

    MessageDriven (mappedName = "JMS/Queue" )
    Открытый класс MessageBean реализует MessageListener {

    @EJB private EntityBeanHomeA entityBeanHomeA;    
    
    @EJB private EntityBeanHomeB entityBeanHomeB;    
    
    @EJB private EntityBeanHomeC entityBeanHomeC;    
    
    @EJB private SessionBeanD sessionBeanD;    
    
    @Resource
    private MessageDrivenContext mdc;
    
    public void onMessage(Message msg) {
    
        final String beanName = // extract somehow the bean name from 'msg'
        final Object obj = getDependentEJB(beanName);
        // do something with 'obj'
    }
    
    private Object getDependentEJB(String beanName) {
        Object result = null;
        if ("EntityBeanHomeA".equals(beanName)) {
             result = entityBeanHomeA;
        else if ("EntityBeanHomeB".equals(beanName)) {
             result = entityBeanHomeB;
        else ("EntityBeanHomeC".equals(beanName)) {
             result = entityBeanHomeC;
        else ("SessionBeanD".equals(beanName)) {
             result = sessionBeanD;
        }
        return result;
    }
    

    }

  • Используйте JNDI-поиск, но объявляйте зависимости EJB через дескрипторы развертывания EJB. Опять же, контейнер должен обеспечить, чтобы все зависимости устанавливались до обработки методов/сообщений:

    @MessageDriven (mappedName = "JMS/Очередь" ) Открытый класс MessageBean реализует MessageListener {

    // as given in the original Question...
    

    }

    Дескриптор развертывания:

    <enterprise-beans>
        <message-driven>
            ... 
            <ejb-name>MessageBean</ejb-name>
            <ejb-class>com.company.pkg.MessageBean</ejb-class> 
            <messaging-type>javax.jms.MessageListener</messaging-type>
            <message-destination-type>javax.jms.Queue</message-destination-type>
            <message-destination-link>ExpenseProcessingQueue</message-destination-link>
            <ejb-ref> 
                <description> This is a reference to an EJB 2.1 entity bean
                  that encapsulates access to employee records. 
                </description>
                <ejb-ref-name>ejb/EmplRecord</ejb-ref-name>
                <ejb-ref-type>Entity</ejb-ref-type>
                <home>com.wombat.empl.EmployeeRecordHome</home>
                <remote>com.wombat.empl.EmployeeRecord</remote> 
                <ejb-link>EmployeeRecord</ejb-link> <-- if in same EJB jar -->
                          <-- ../emp/emp.jar#EmployeeRecord   if in diff EJB jar -->
            </ejb-ref>
            <ejb-local-ref> 
                <description> This is a reference to the local business interface
                   of an EJB 3.0 session bean that provides a payroll service. 
                </description> 
                <ejb-ref-name>ejb/Payroll</ejb-ref-name>
                <local>com.aardvark.payroll.Payroll</local> 
                <ejb-link>Payroll</ejb-link> 
            </ejb-local-ref>
            <ejb-local-ref> 
                <description> This is a reference to the local business interface of an
                  EJB 3.0 session bean that provides a pension plan service. 
                </description>
                <ejb-ref-name>ejb/PensionPlan</ejb-ref-name>
                <local>com.wombat.empl.PensionPlan</local> 
                <ejb-link>PensionPlan</ejb-link> <-- if in same EJB jar -->
            </ejb-local-ref> 
            ...
        </message-driven>
        ... 
    </enterprise-beans>
    
  • Используйте поиск JNDI, но не объявляйте зависимости, используя аннотации @EJB или развертывание EJB - полностью обрабатывайте свою логику без помощи контейнера. Используйте задержки/обработку ошибок.

  • Используйте конфигурацию JBoss для управления порядком развертывания:

    http://texnoblog.wordpress.com/2010/09/16/depends-in-jboss/

    Как заказать развертывание конфигураций очереди EJB и JMS в JBoss 5?

Ответ 2

Один из способов - создать фиктивный ejb, который вы введете в ваш MDB, таким образом ваш mdb не начнет потреблять, пока эта инъекция не сможет фактически произойти.

Если dummy-ejb связан с EJB, на которые вы намеревались выполнить динамический поиск, это должно работать

Мой ответ здесь разрешает аналогичный прецедент.

Ответ 3

Я думаю, что лучшим подходом было бы отложить развертывание вашего MDB до тех пор, пока все ваши EJB не будут запущены и запущены. Это в основном подход номер 4 в ответе выше.

"Используйте конфигурацию JBoss для управления порядком развертывания:

http://texnoblog.wordpress.com/2010/09/16/depends-in-jboss/

Как заказать развертывание конфигураций очереди EJB и JMS в JBoss 5?"

Ответ 4

вы можете реализовать цикл с отступлением от вызова поиска.