我在有两个测试类的项目中运行所有测试。首先启动用@EnableJms
注释的测试类,并接收带有@JmsListener
注释的接收方法。测试通过,一切正常。然后启动另一个也用@EnableJms
注释并且也有@JmsListener
的测试类。这是问题所在。在第二类中,永远不会调用带有以上注释进行注释的接收方法。控制台中有警告,例如:
WARN 2077 --- [enerContainer-1] o.s.j.l.DefaultMessageListenerContainer : Execution of JMS message listener failed, and no ErrorHandler has been set.
第一堂课
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestApplication.class})
@Import({ActiveMQConfig.class})
@EnableJms
@TestPropertySource("jms.properties")
public class JmsTestOne {
@Test
public void sendMessage() throws Exception {
LOGGER.info("Starting sendMessage()#1 test");
latch = new CountDownLatch(ONE_PERMIT);
PojoJmsProducer producer = ctx.getBean(PojoJmsProducer.class);
JmsMessagePojo msg = new JmsMessagePojo("test data");
producer.send(msg);
assertTrue("Received message", latch.await(TIMEOUT_RECEIVE_JMS_MESSAGE, TimeUnit.MILLISECONDS));
}
@JmsListener(destination = "someTopic", containerFactory = "jmsListenerFactoryTopic")
public void receiveMessage(JmsMessagePojo messagePojo) {
latch.countDown();
}
}
第二个类几乎相同,但是JmsListener具有不同的目的地,而不是主题。
@JmsListener(destination = "someQueue", containerFactory = "jmsListenerFactoryQueue")
public void receiveMessage(JmsMessagePojo messagePojo) {
latch.countDown();
}
再次。我开始所有测试。首先是从第一个测试类调用测试,然后从第二个类调用。从一开始它就过去了。从第二号开始我想我需要显式关闭会话,连接,销毁,但我不知道如何。
PS:这些生产者/消费者正在连接到在我的系统中运行的代理,这没关系。
PS 2:当我分别单独运行测试时,一切正常。第一种@JmsListener
方法对使用@JmsListener
的第二种方法有影响。
PS 3:如果在第一个 JmsTestOne 类中,我将@JmsListener
接收方法提取到新类中,然后在测试方法范围内使用此类实例接收器,则所有测试都将通过。