Мост между темами и очередями встроенного брокера ActiveMQ с конфигурацией XML

Моя цель + прогресс

Я заинтересован в использовании ActiveMQ для публикации сообщения в теме и его подключения к нескольким очередям. Мне удалось добиться этого с помощью брокера командной строки, предоставив xml-config, содержащий составную тему:

<destinationInterceptors>
    <virtualDestinationInterceptor>
        <virtualDestinations>
            <compositeTopic name="LOCAL.EC.T">
                <forwardTo>
                    <queue physicalName="LOCAL.EC.Q.1" />
                    <queue physicalName="LOCAL.EC.Q.2" />                       
                </forwardTo>
            </compositeTopic>
        </virtualDestinations>
    </virtualDestinationInterceptor>
</destinationInterceptors>

Используя эту команду запуска: activemq start xbean:amq.xml. В данном случае amq.xml — это мой активный XML-файл конфигурации MQ. Подробнее о конфигурации xml см. здесь: http://activemq.apache.org/xml-configuration.html. .

Моя проблема

Если я опубликую сообщение в теме выше с помощью веб-консоли, оно появится в обеих очередях, как и ожидалось. Но теперь я хочу перейти на использование встроенного брокера.


В следующем коде я могу сказать, что он использует мой файл amq.xml (когда я изменяю его, я получаю соответствующие ошибки), но когда я публикую в теме, получение в очереди блокируется навсегда. Если я публикую и получаю в одну и ту же тему или очередь, все работает нормально. Почему моя составная тема здесь не работает?


//Create the broker using the xbean configuration and start it.
brokerService = BrokerFactory.createBroker(new URI("xbean:amq.xml"));
brokerService.setBrokerName("localhost");
brokerService.setPersistent(false);
brokerService.setDeleteAllMessagesOnStartup(true);
brokerService.setUseJmx(false);
brokerService.start();

//Create the connection factory and JMS template.
connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL("vm://localhost?create=false&jms.redeliveryPolicy.maximumRedeliveries=-1");

//Send the message to the topic.
template = new JmsTemplate(connectionFactory);
ActiveMQMapMessage message = new ActiveMQMapMessage();
message.setString("batch", "Hello World!");
template.convertAndSend("LOCAL.EC.T",message);

//Read the message from the queues.
final Message receive = template.receive("LOCAL.EC.Q.1");
MapMessage received = (MapMessage)receive;
System.out.println(received.getString("batch"));  

person John Humphreys    schedule 26.09.2014    source источник


Ответы (1)


Я нашел пример на веб-сайте, который демонстрировал, как создать сообщение немного другим способом. К сожалению, я закрыл вкладку и не могу найти ссылку на нее.

В любом случае, я объединил этот стиль создания сообщений с моей конфигурацией xbean, и теперь все работает. Вот рабочий код:

brokerService = BrokerFactory.createBroker(new URI("xbean:amq.xml"));
brokerService.setPersistent(false);
brokerService.setDeleteAllMessagesOnStartup(true);
brokerService.setUseJmx(false);
brokerService.start();

connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
template = new JmsTemplate(connectionFactory);

//Create a connection.
Connection connection = connectionFactory.createConnection();
connection.start();

//Create a session.
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

//Create a topic and publish to it - it should be linked to 4 queues by the configuration.
System.out.println("Posting message to topic:");
Destination destination = session.createTopic("LOCAL.EC.T");
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
ActiveMQMapMessage message = new ActiveMQMapMessage();
message.setString("batch", "Hello World!");
producer.send(message);

//Read the message from the queues.
System.out.println("Q1: " + ((MapMessage)receive("LOCAL.EC.Q.1")).getString("batch"));
System.out.println("Q2: " + ((MapMessage)receive("LOCAL.EC.Q.2")).getString("batch"));
System.out.println("Q3: " + ((MapMessage)receive("LOCAL.EC.Q.3")).getString("batch"));
System.out.println("Q4: " + ((MapMessage)receive("LOCAL.EC.Q.4")).getString("batch"));

Вывод:

Отправка сообщения в тему:

Q1: Привет, мир!

Q2: Привет, мир!

Q3: Привет, мир!

Q4: Привет, мир!

Завершение приложения.

Надеюсь, это поможет кому-то еще!

person John Humphreys    schedule 26.09.2014