Glassfish 3.1 ActiveMQ и общие сообщения о потреблении - PullRequest
2 голосов
/ 24 октября 2011

Используемые технологии.

  • ActiveMQ 5.5.1
  • Glassfish 3.1
  • genericra 2.1

Где я нахожусь;

  • У меня установлен и работает ActiveMQ
  • genericra настроен и работает в Glassfish. Я настроил ресурс соединителя (amqRes), пул соединений соединителя (amqPool) и ресурс объекта администратора (amqQueue). Развернута общая конфигурация и настроены конфигурации адаптера ресурса.
  • Я могу отправить сообщение в очередь activeMQ из приложения, запущенного в Glassfish. Когда я публикую сообщение, я вижу новую запись в очереди в консоли администратора activeMQ.

Мы используем другие очереди JMS (внутри Glassfish), и они работают хорошо.

Проблема в том, что я получаю сообщение из очереди от activeMQ. Я написал тестовый бин @MessageDriven, который реализует javax.jms.MessageListener. У него есть один простой метод (onMessage), который просто выводит сообщение. Я не уверен, как зарегистрировать MDB, чтобы он принимал сообщения из очереди activeMQ. Я видел довольно много примеров размещения записей в ejb-jar.xml, glassfish-ejb-jar.xml или sun-ejb-jar.xml - ни один из которых не работал для меня. Когда я смотрю в консоли activeMQ, я не вижу ни одного пользователя для созданной мной очереди.

Я прочитал несколько блогов, но, похоже, пропустил этот последний кусок головоломки.

import javax.ejb.MessageDriven;
import javax.jms.Message;

@MessageDriven(mappedName = "amqQueue")
public class ActiveMQTestListener implements javax.jms.MessageListener {
    public void onMessage(Message message) {
        System.out.println(message.toString());
    }
}

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

ОК, так что после долгих тренировок у меня все заработало.Оказывается, вам не нужно создавать ресурс коннектора, пул соединений или ресурс объекта администратора для получения сообщения от активного mq.

В итоге я развернул коннектор genericra.rar (я изменил имя на genericRA) в glassfish http://java.net/downloads/genericjmsra/v2.1a/binaries/. Я сконфигурировал конфигурации адаптеров ресурсов, используя настройки http://activemq.apache.org/sjsas-with-genericjmsra.html (скопировано ниже)- Слегка модифицированный, чтобы соответствовать примеру).Я ввел подробности вручную в Glassfish.

asadmin create-resource-adapter-config
  --property
  SupportsXA=true
  :RMPolicy=OnePerPhysicalConnection
  :ProviderIntegrationMode=javabean
  :ConnectionFactoryClassName=org.apache.activemq.ActiveMQConnectionFactory
  :QueueConnectionFactoryClassName=org.apache.activemq.ActiveMQConnectionFactory
  :TopicConnectionFactoryClassName=org.apache.activemq.ActiveMQConnectionFactory
  :XAConnectionFactoryClassName=org.apache.activemq.ActiveMQXAConnectionFactory
  :XAQueueConnectionFactoryClassName=org.apache.activemq.ActiveMQXAConnectionFactory
  :XATopicConnectionFactoryClassName=org.apache.activemq.ActiveMQXAConnectionFactory
  :UnifiedDestinationClassName=org.apache.activemq.command.ActiveMQDestination
  :QueueClassName=org.apache.activemq.command.ActiveMQQueue
  :TopicClassName=org.apache.activemq.command.ActiveMQTopic
  :ConnectionFactoryProperties=brokerURL\\=tcp\\://127.0.0.1\\:61616
  :LogLevel=FINE
  genericRA

Если вы хотите получить эль для отправки со glassfish, мы обнаружили, что ресурс объекта admin не появился в списке jndi (./asadmin list-jndi-records).Мы обнаружили, что ресурс объекта admin был отключен.Нам пришлось отредактировать domain.xml и установить enabled = true.

Мой тестовый объект, управляемый компонентом;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(activationConfig =  {
    @ActivationConfigProperty(propertyName = "destinationType",propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destinationProperties",propertyValue = "PhysicalName=amqQueue")
})
public class ActiveMQTestListener implements MessageListener {
    public void onMessage(Message message) {
        System.out.println(message.toString());
    }
}

Мой glassfish-ejb-jar.xml;

<glassfish-ejb-jar>
    <enterprise-beans>
        <ejb>
            <ejb-name>ActiveMQTestListener</ejb-name>
            <mdb-resource-adapter>
                <resource-adapter-mid>genericRA</resource-adapter-mid>
            </mdb-resource-adapter>
        </ejb>
    </enterprise-beans>
</glassfish-ejb-jar>

Я запустил activeMQ, glassfish (в режиме отладки, чтобы я мог видеть сообщение) и вызвал консоль (http://localhost:8161/admin). Я создал новую очередь под названием amqQueue. Я создалновое сообщение (отправьте в консоли activeMQ), установите для пункта назначения значение amqQueue и введите текст в теле сообщения. Нажмите кнопку отправить, и в коде будет активирована точка останова.

1 голос
/ 24 апреля 2012

Если вы хотите подключить ActiveMQ к Glassfish 3, взгляните на мою статью: http://geertschuring.wordpress.com/2012/04/20/how-to-connect-glassfish-3-to-activemq-5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...