如何指示spring实例化消息侦听器容器?

如何指示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

我使用的是Spring4.2.3和Java1.7

我有一个单元测试

@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
之后,组件开始工作