保持春季上下文处于活动状态,直到使用 JMS 消息
我有一个相当标准的设置与 - 和.它工作正常,直到我试图做一个简单的集成测试。经过一些调查,我发现Spring上下文和嵌入式代理在使用第一条JMS消息后都关闭了,无论在消耗期间,都会触发另一个事件。我能够通过在测试设置中添加连接选项来解决代理问题,即JMS
Spring Boot
ActiveMQ
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) {
}
我尝试过的一件事是添加延迟,即 发送邮件后。但是,这是非常不可靠的,并且也会减慢测试速度,因为执行可能需要不到50ms。下面是测试本身。除非等待被取消注释,否则我永远不会到达第二个事件侦听器,因为应用程序上下文关闭,测试结束并且消息被“遗忘”。sleep(200)
@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
}
}