2012-05-05 2 views
1

мне было интересно, как проверить JMS с помощью ActiveMQ на основе ответа предлагая с помощью ActiveMQ, чтобы сделать тест Simulating JMS - jUnitТестовый пример для ActiveMQ

Однако, я не получаю сообщение я ожидал от MessageConsumer. Если я использовал его, он просто зависает там.

Вот мой код

import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.MessageConsumer; 
import javax.jms.MessageProducer; 
import javax.jms.Queue; 
import javax.jms.Session; 
import javax.jms.TextMessage; 

import org.apache.activemq.ActiveMQConnectionFactory; 
import org.junit.Assert; 
import org.junit.Test; 

public class JmsTest { 
@Test 
public void test() throws Exception { 
    final ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
      "vm://localhost?broker.persistent=true"); 
    final Queue queue; 
    final Connection connection = connectionFactory.createConnection(); 
    final Session session = connection.createSession(true, 
      Session.AUTO_ACKNOWLEDGE); 
    { 
     queue = session.createQueue("test"); 
    } 
    { 
     final MessageProducer producer = session.createProducer(queue); 
     final TextMessage message = session.createTextMessage("testing"); 
     producer.send(message); 
    } 
    { 
     final MessageConsumer consumer = session.createConsumer(queue); 
     final TextMessage message = (TextMessage) consumer.receiveNoWait(); 
     // "message" is null at this point 
     Assert.assertEquals("testing", message.getText()); 
    } 
} 
} 

ответ

1

Спасибо Тиму, мы нашли его примерно в то же самое время, но мне пришлось внести несколько других изменений, как я указал в своем комментарии. В двух словах, я должен убедиться, что атрибут «transactional» является «ложным», и, как заметил Тим, мне пришлось выполнить вызов connection.start().

@Test 
public void test() throws Exception { 
    final ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
      "vm://localhost?broker.persistent=false"); 

    final Connection connection = connectionFactory.createConnection(); 
    connection.start(); 
    final Session session = connection.createSession(false, 
      Session.AUTO_ACKNOWLEDGE); 
    final Queue queue = session.createTemporaryQueue(); 
    { 
     final MessageProducer producer = session.createProducer(queue); 
     final TextMessage message = session.createTextMessage("testing"); 
     producer.send(message); 
    } 
    { 
     final MessageConsumer consumer = session.createConsumer(queue); 
     final TextMessage message = (TextMessage) consumer.receiveNoWait(); 
     Assert.assertNotNull(message); 
     Assert.assertEquals("testing", message.getText()); 
    } 
} 
2

Перед тем, как можно получить сообщение, Вам необходимо позвонить connection.start() в противном случае сообщения не будут отправлены потребителю. Также ваш код не должен предполагать, что receiveNoWait всегда будет возвращать сообщение, так как может потребоваться небольшое количество времени для того, чтобы сообщение было отменено и перенаправлено потребителю, поэтому попытка повторной попытки или использование вызванного по времени вызова receive() может быть подходящее.

1

Использование темы будет выглядеть примерно так:

 final ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); 
     final javax.jms.Connection connection = connectionFactory.createConnection(); 
     connection.setClientID("12345"); 
     connection.start(); 

     final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     final Topic temporaryTopic = session.createTemporaryTopic(); 

     final MessageConsumer consumer1 = session.createConsumer(temporaryTopic); 

     final MessageProducer producer = session.createProducer(temporaryTopic); 
     producer.send(session.createTextMessage("Testmessage")); 

     final TextMessage message = (TextMessage)consumer1.receiveNoWait(); 


     Assert.assertNotNull(message); 
     Assert.assertEquals("testing", message.getText()); 
+0

Как @ тим-Биш сказал, connection.start() должна быть вызвана, прежде чем она используется. –

+0

потребитель должен быть создан до того, как производитель отправит сообщение. –

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