如何指示spring实例化消息侦听器容器?
我使用的是Spring4.2.3和Java1.7 我有一个单元测试如何指示spring实例化消息侦听器容器?,spring,jms,activemq,spring-jms,Spring,Jms,Activemq,Spring Jms,我使用的是Spring4.2.3和Java1.7 我有一个单元测试 @ContextConfiguration(classes = TestConfiguration.class) public class TestJmsListener extends AbstractTestNGSpringContextTests { @Autowired private JmsMessagingTemplate jmsTemplate; @Autowired @Qual
@ContextConfiguration(classes = TestConfiguration.class)
public class TestJmsListener extends AbstractTestNGSpringContextTests {
@Autowired
private JmsMessagingTemplate jmsTemplate;
@Autowired
@Qualifier("destination")
private Destination destination;
@Test
public void test() {
assert(jmsTemplate.convertSendAndReceive(destination, "test", Boolean.class));
}
}
测试调用TestConfiguration类,但实际上这只是扩展了下面的配置。在TestConfiguration中,我只覆盖connectionFactory,以便它实例化一个嵌入式activemq代理
@Configuration
@EnableJms
@ComponentScan("messaging")
@PropertySource(value = "classpath:messaging.properties")
public class CommonMessagingConfiguration {
// bunch of beans, connection factories, destinations, etc
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrency("10");
return factory;
}
}
测试执行了,在日志中我可以看到为我的“测试”消息创建了一个队列。消息在队列上挂起,但是,队列中没有使用者。以下是我的侦听器实现:
@Component
public class JmsExampleListener {
@JmsListener(containerFactory = "jmsListenerContainerFactory",
destination = "${messaging.destinations.example}")
public boolean listen(String message) {
return message != null;
}
}
当我将调试器附加到DefaultJmsListenerContainerFactory#createContainerInstance()
时,我注意到它曾经被命中。但是,当我将一个附加到jmsListenerNotationBeanPostProcessor#postProcessAfterInitialization
时,它会到达断点,我可以看到spring正在检测我的组件。Spring实例化它并向它的内部注册器注册该实例(正如我所期望的)
问题似乎在于,从未为已注册的端点创建容器。我试着跟随他们,但是他们没有提供任何见解
我注意到的一件事是,侦听器后处理器有一个内部注册器,它有一个内部属性startimly
,该属性为false。它似乎扩展了InitializingBean
,因此,将start属性设置为true,我认为这将开始启动容器。。。然而,这并没有发生。事实上,如果我在afterPropertieSet
上设置了一个断点,它将永远不会被调用。我会假设,因为后处理器中的实例不是spring管理的bean
有没有人尝试过类似于我正在做的事情,并且有相同的问题
更新
在进一步调查之后,似乎由
@EnableJms
实例化的在容器配置后没有调用它的aftersingletonInstanced
。上述方法中的逻辑负责为所有注册端点构造MessageListenerContainer
。为什么不调用实例化后的aftersingletons
?应用程序上下文不应该自动调用它吗?事实证明,我有一个项目依赖关系,导致spring上下文源版本为4.0.9。在我解决了冲突并有效地从4.2.3加载了AbstractApplicationContext
之后,组件开始工作