2012-05-05 27 views
1

我想知道如何根據使用的答案ActiveMQ的做測試Simulating JMS - jUnit測試用例的ActiveMQ

但是建議測試JMS使用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」屬性是「false」,正如Tim所說的,我必須執行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

作爲@ TIM-BISH說,connection.start()需要使用數據之前被調用。 –

+0

消費者需要在生產者發送消息之前創建。 –