Бин, управляемый сообщениями, с источником данных

У меня вопрос: как настроить объект EJB 3.0, управляемый сообщениями, для использования настроенного источника данных JMS в jboss.

Например, мой MDB выглядит примерно так:

@MessageDriven(mappedName = "ExampleMDB", activationConfig = {

        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "MyTopic"),
        @ActivationConfigProperty(propertyName = "channel", propertyValue = "MyChannel"),

})
@ResourceAdapter(value = "wmq.jmsra.rar")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@TransactionManagement(TransactionManagementType.BEAN)
public class MyMDB implements MessageListener {
 .....
}

Но я бы хотел, чтобы компонент был прикреплен к данному источнику данных JMS (в случае jboss 4.2.2 это находится в deploy / jms / jms-ds.xml). Возможно, это даже невозможно, но стоит спросить.

Вы имеете в виду, что хотите управлять источником данных из метода onMessage ()?

johnstok 05.11.2008 15:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
3 591
2

Ответы 2

Если я правильно понял вашу проблему, MyMDB прослушивает тему в WebLogic, и вы хотите использовать дополнительное место назначения JMS, предоставляемое JBoss, определенное в развернутом файле конфигурации и идентифицированное его именем JNDI (по умолчанию deploy/jms/jms-ds.xml содержит только конфигурацию для поставщик JMS и фабрики соединений - без источников данных).

Самый простой способ - позволить контейнеру внедрить назначение JMS и фабрику соединений через свое имя JNDI (в JBoss назначения JMS настраиваются с помощью развертывание файлов xxx-service.xml). Затем при запуске вы можете инициализировать соединение и выполнить очистку, как только MDB будет выпущен.

В следующих примерах показано внедрение (@Resource) и управление ресурсами (@PostConstruct и @PreDestroy). Соединение и место назначения JMS используются в useJmsDestination(String) для отправки текстового сообщения.

public class MyMDB implements MessageListener {

    @Resource(mappedName = "queue/YourQueueName") // can be topic too
    private Queue targetDestination;

    @Resource(mappedName = "QueueConnectionFactory") // or ConnectionFactory
    private QueueConnectionFactory factory;

    private Connection conn;

    public void onMessage(Message m) {
        // parse message and do what you need to do
        ...
        // do something with the message and the JBoss JMS destination
        useJmsDestination(messageString);     
    }

    private void useJmsDestination(String text) {
        Session session = null;
        MessageProducer producer = null;

        try {
            session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE);
            producer = session.createProducer(targetDestination);
            TextMessage msg = session.createTextMessage(text);
            producer.send(msg);
        } catch (JMSException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (producer != null) {
                    producer.close();
                }
                if (session != null) {
                    session.close();
                }
            } catch (JMSException e) {
                // handle error, should be non-fatal, as the message is already sent.
            }
        }
    }


    @PostConstruct
    void init() {
        initConnection();
        // other initialization logic
        ...
    }

    @PreDestroy
    void cleanUp() {
        closeConnection();
        // other cleanup logic
        ...
    }

    private void initConnection() {
        try {
            conn = factory.createConnection();
        } catch (JMSException e) {
            throw new RuntimeException("Could not initialize connection", e);
        }
    }

    private void closeConnection() {
        try {
            conn.close();
        } catch (JMSException e) {
            // handle error, should be non-fatal, as the connection is being closed
        }
    }
}

Я надеюсь это тебе поможет.

Я думаю, что вы спрашиваете "Как указать расположение JNDI источника данных JMS для использования в MDB?"

В этом случае ответ:

@ActivationConfigProperty(propertyName = "providerAdapterJNDI", propertyValue = "java:/DefaultJMSProvider")

Также обратите внимание на следующую страницу, которая предоставляет множество полезных сведений о настройке MDB в jBoss: http://www.jboss.org/community/docs/DOC-9352

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