代码之家  ›  专栏  ›  技术社区  ›  Conffusion

使用嵌入式Artemis对JMS 2.0进行单元测试

  •  0
  • Conffusion  · 技术社区  · 4 年前

    我尝试测试一个使用JMS2.0neneneba API来使用JMS消息的应用程序。

    为了降低测试的复杂性,我使用MessageProducer在测试中发送一条消息,并尝试在同一会话上使用MessageConsumer读回它。

    我使用了一个符合JMS 2.0标准的嵌入式ActiveMQ Artemis 2.5.0实例。

    package be.attle;
    
    import javax.jms.CompletionListener;
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.MessageConsumer;
    import javax.jms.MessageProducer;
    import javax.jms.Queue;
    import javax.jms.Session;
    
    import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
    import org.apache.activemq.artemis.api.core.client.ServerLocator;
    import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
    import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory;
    import org.apache.activemq.artemis.junit.EmbeddedActiveMQResource;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Rule;
    import org.junit.Test;
    import org.mockito.MockitoAnnotations;
    
    public class ActiveMQTest {
        @Rule
        public EmbeddedActiveMQResource resource = new EmbeddedActiveMQResource();
    
        private Queue queue;
        
        private ConnectionFactory factory;
        private Session session;
        
        @Before
        public void setUp() throws Exception
        {
            MockitoAnnotations.initMocks(this);
            ServerLocator serverLocator =  ActiveMQClient.createServerLocator("vm://0");
            factory=new ActiveMQJMSConnectionFactory(serverLocator);
            queue = ActiveMQJMSClient.createQueue(AsyncJobConst.QUEUE_NAME);
            Connection conn=factory.createConnection();
            session=conn.createSession(false,Session.CLIENT_ACKNOWLEDGE);
        }
        
        @Test
        public void easyPeasy() throws JMSException
        {
            
            MessageProducer producer=session.createProducer(queue);
            CompletionListener listener=new CompletionListener() {
                
                @Override
                public void onException(Message message, Exception exception) {
                    System.err.println("message send failed:"+exception);
                }
                
                @Override
                public void onCompletion(Message message) {
                    System.out.println("message send successfully");                
                }
            };
            
            producer.send(session.createTextMessage("testBody1"),listener);
            producer.send(session.createTextMessage("testBody2"),listener);
            // (1)
            // let's try the consume the first message
            MessageConsumer consumer=session.createConsumer(queue);
            Message message=consumer.receiveNoWait();
            Assert.assertNotNull(message);
        }
    }
    

    在(1)处,控制台显示两次“消息发送成功”。但是,当我尝试从队列中读取时,断言失败(=找不到消息)。我的会话未处理。

    我在这里错过了什么?

    0 回复  |  直到 4 年前
        1
  •  4
  •   Justin Bertram    4 年前

    致电 start() 需要在连接上启动连接对传入消息的传递。你可以找到一个简单的例子 here .