如何正确测试ActiveMQ主题发布

如何正确测试ActiveMQ主题发布,activemq,Activemq,我正在努力测试我的代码是否正确地发布了有关该主题的消息。我知道我可以用JMeter或其他什么东西;但是我想在代码库中对嵌入式代理进行测试。最初它是一个基于Spring的解决方案,然而,为了简化它,我提供了一个最小的可复制解决方案 守则的要点是: @Test public void testPublisherService() { final String payload = "test-dummy-message"; JmsTemplate destinationTemp

我正在努力测试我的代码是否正确地发布了有关该主题的消息。我知道我可以用JMeter或其他什么东西;但是我想在代码库中对嵌入式代理进行测试。最初它是一个基于Spring的解决方案,然而,为了简化它,我提供了一个最小的可复制解决方案

守则的要点是:

    @Test
public void testPublisherService() {
    final String payload = "test-dummy-message";
    JmsTemplate destinationTemplate = buildJmsTemplate();
    JmsTemplate sourceTemplate = buildJmsTemplate();
    sourceTemplate.setReceiveTimeout(10000);
    JmsPublisherService service = new JmsPublisherService(destinationTemplate);

    log.info("Going to publish message");
    service.send(TOPIC_NAME, payload);
    log.info("Message is published");

    log.info("Going to retrieve message");
    Object retrieved = sourceTemplate.receiveAndConvert(new ActiveMQTopic(TOPIC_NAME));
    log.info("Message is retrieved");

    Assert.assertNotNull(retrieved);
}
它失败了!i、 e.始终从主题接收空值!我为ActiveMQ添加了调试日志记录,但也没有太大帮助:

2018-12-19 10:17:37.393  INFO   --- [main] ru.mkv.jms.JmsPublisherIntTest           : Message is published
2018-12-19 10:17:37.393  INFO   --- [main] ru.mkv.jms.JmsPublisherIntTest           : Going to retrieve message
2018-12-19 10:17:37.393 DEBUG   --- [ActiveMQ VMTransport: vm://test_broker#1-1] o.a.a.broker.jmx.ManagementContext       : Unregistering MBean org.apache.activemq:type=Broker,brokerName=test_broker,destinationType=Topic,destinationName=test_topic,endpoint=Producer,clientId=clientId4.74703049017198,producerId=ID_EEW00163-52272-1545207456632-4_1_1_1
2018-12-19 10:17:37.393 DEBUG   --- [ActiveMQ VMTransport: vm://test_broker#1-1] o.a.activemq.broker.TransportConnector   : Publishing: vm://test_broker for broker transport URI: vm://test_broker
2018-12-19 10:17:37.393 DEBUG   --- [ActiveMQ VMTransport: vm://test_broker#1-1] o.a.activemq.broker.TransportConnector   : Publishing: vm://test_broker for broker transport URI: vm://test_broker
2018-12-19 10:17:37.399 DEBUG   --- [ActiveMQ VMTransport: vm://test_broker#1-2] o.a.a.broker.region.AbstractRegion       : test_broker adding consumer: ID:EEW00163-52272-1545207456632-4:1:2:1 for destination: topic://test_topic
2018-12-19 10:17:37.400 DEBUG   --- [ActiveMQ VMTransport: vm://test_broker#1-2] o.a.activemq.broker.TransportConnector   : Publishing: vm://test_broker for broker transport URI: vm://test_broker
2018-12-19 10:17:37.400 DEBUG   --- [ActiveMQ VMTransport: vm://test_broker#1-2] o.a.activemq.broker.TransportConnector   : Publishing: vm://test_broker for broker transport URI: vm://test_broker
2018-12-19 10:17:37.400 DEBUG   --- [ActiveMQ VMTransport: vm://test_broker#1-2] o.a.a.broker.region.AbstractRegion       : test_broker adding destination: topic://ActiveMQ.Advisory.Consumer.Topic.test_topic
2018-12-19 10:17:37.402 DEBUG   --- [main] o.a.activemq.thread.TaskRunnerFactory    : Initialized TaskRunnerFactory[ActiveMQ Session Task] using ExecutorService: java.util.concurrent.ThreadPoolExecutor@3e27ba32[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]

2018-12-19 10:17:47.405 DEBUG   --- [main] o.a.activemq.ActiveMQMessageConsumer     : remove: ID:EEW00163-52272-1545207456632-4:1:2:1, lastDeliveredSequenceId: -1
2018-12-19 10:17:47.406 DEBUG   --- [ActiveMQ VMTransport: vm://test_broker#1-2] o.a.a.broker.jmx.ManagementContext       : Unregistering MBean org.apache.activemq:type=Broker,brokerName=test_broker,destinationType=Topic,destinationName=test_topic,endpoint=Consumer,clientId=clientId4.74703049017198,consumerId=ID_EEW00163-52272-1545207456632-4_1_2_1
2018-12-19 10:17:47.407 DEBUG   --- [ActiveMQ VMTransport: vm://test_broker#1-2] o.a.a.broker.region.AbstractRegion       : test_broker removing consumer: ID:EEW00163-52272-1545207456632-4:1:2:1 for destination: topic://test_topic
2018-12-19 10:17:47.407  INFO   --- [main] ru.mkv.jms.JmsPublisherIntTest           : Message is retrieved
2018-12-19 10:17:47.408  INFO   --- [main] o.apache.activemq.broker.BrokerService   : Apache ActiveMQ 5.15.3 (test_broker, ID:EEW00163-52272-1545207456632-0:1) is shutting down

我怀疑这与连接/代理生命周期有关,而我对此知之甚少。。或者可能是检索方法。顺便说一句,ActiveMQ文档的范围似乎非常有限,我无法找到任何关于其实际工作方式的深入文档

这是预期的行为。在任何订阅存在之前,您正在向主题发送消息。发送到没有订阅的主题的消息将被丢弃。这就是主题的工作原理。您需要创建订阅,发送消息,然后从订阅中检索消息。除此之外,您可以切换到使用队列而不是主题。如果你那样做了,我希望你的测试能顺利进行


也可以考虑使用JMS API,而不是在JMS API之上使用Spring,因为它可能更简单。

这是我的主要假设$)谢谢!我会检查的。另外,在我发布到队列的另一个项目中,我让我的代码从队列中提取它,并发布主题,然后聆听主题。显然,这也是有缺陷的,但是由于生产代码需要一些时间来处理和发布消息,所以我的测试代码成功地订阅了消息,并且没有遇到任何错误。如果一切正常,我会检查并批准答案