2014-09-26 3 views
1

Моя цель + ПрогрессActiveMQ встроенный брокер тему к очереди моста с XML конфигурации

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

<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 - это мой активный файл конфигурации MQ XML. Здесь больше информации о конфигурации 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")); 

ответ

2

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

В любом случае, я объединил этот стиль создания сообщений с моей конфигурацией 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: Hello World!

Q2: Hello World!

Q3: Hello World!

Q4: Hello World!

Окончание заявки.

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

Смежные вопросы