【发布时间】:2018-08-23 07:25:36
【问题描述】:
我有一个与 JMS - Spring Boot 和 ActiveMQ 相关的非常标准的设置。它工作正常,直到我尝试做一个简单的集成测试。经过一番调查,我发现在消费第一条 JMS 消息后,Spring 上下文和嵌入式代理都关闭了,无论在消费期间,都会触发另一个事件。我能够通过在测试设置中添加useShutdownHook=false 连接选项来解决代理问题,即
spring.activemq.broker-url = vm://broker?async=false&broker.persistent=false&broker.useShutdownHook=false
我正在寻找的基本上是一种强制测试“保持活动状态”直到所有 JMS 消息都被消耗的方法(在这种情况下它们只有两条)。我了解整个设置的异步性质,但在测试期间,获取这些消息的所有生成和使用结果会很有帮助。
下面是我的设置,虽然很简单。
@EnableJms
public class ActiveMqConfig {
@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
jmsTemplate.setMessageConverter(messageConverter);
return jmsTemplate;
}
@Bean
public MessageConverter messageConverter() {
MappingJackson2MessageConverter messageConverter = new MappingJackson2MessageConverter();
messageConverter.setTargetType(MessageType.TEXT);
messageConverter.setTypeIdPropertyName("_type");
return messageConverter;
}
}
然后我有一个消息驱动的 POJO 来监听给定的事件:
@JmsListener(destination = "events")
public void applicationSubmitted(MyType event) {
// do some work with the event here
jmsTemplate.convertAndSend("commands", mymessage);
}
还有一个:
@JmsListener(destination = "commands")
public void onCommand(TextMessage textMessage) {
}
我尝试过并且有效的一件事是在发送消息后添加延迟,即sleep(200)。但是,这是非常不可靠的,并且还会减慢测试速度,因为执行时间可能少于 50 毫秒。下面是测试本身。除非等待未注释,否则我永远不会到达第二个事件侦听器,因为应用程序上下文关闭,测试结束并且消息被“遗忘”。
@SpringBootTest
class MyEventIntegrationTest extends Specification {
@Autowired
JmsTemplate jmsTemplate
def "My event is successfully handled"() {
given:
def event = new MyEvent()
when:
jmsTemplate.convertAndSend("events", event)
// sleep(200)
then:
1 == 1
}
}
【问题讨论】:
-
你到底想用你的测试来测试什么?您是否正在尝试检查消息是否已收到?
-
间接地,即我想测试出现的消息序列是否会导致我期望的结果(保存在数据库中的东西)。
标签: java spring-boot jms activemq