DefaultMessageListenerContainer未能接收到消息。

7

我有一个如下配置的DefaultMessageListenerContainer:

DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConcurrentConsumers(4);
container.setConnectionFactory(connectionFactory);
container.setDestinationName(String.format("Consumer.%s.VirtualTopic.%s", group, topic));
container.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
container.setSessionTransacted(true);
container.setMessageListener(new DelegatingMessageListener(listener, messageMapper, event));

container.start();

消息容器没有接收到消息,我的消息监听器也没有被调用。只需将DefaultMessageListenerContainer切换为SimpleMessageListenerContainer,其他保持不变,它就可以工作-但是SimpleMessageListenerContainer在连接丢失后无法恢复。

日志中没有错误,并且几乎没有相关的消息。有人知道这种情况发生的原因吗?


对我来说毫无意义,请尝试打开TRACE级别日志记录。 - Gary Russell
@GaryRussell 我已经启用了跟踪。ActiveMQ本身似乎甚至没有记录任何东西,这表明订阅实际上从未发生(我怀疑)。查看Spring的源代码,我发现SimpleMessageListenerContainer有一个重写的doStart方法,实际上创建了监听器。我没有在DefaultMessageListenerContainer中看到相应的代码,这很有趣。也许我漏掉了什么。 - Colin M
当然,你需要调用 afterPropertiesSet() - Gary Russell
1个回答

22
在Java中构建容器(不在Spring应用程序上下文中),需要在调用start()之前调用afterPropertiesSet()方法。
对于Spring bean,上下文会自动执行此操作。

2
谢谢!这个完美地解决了问题。现在我感觉很蠢。我本来可以通过上下文注册所有内容,但是我有一个共享库中的代码,每个服务都依赖于它,并且服务订阅了Spring JMS层之上的抽象(因此它们不知道JMS的存在 - 它们只是从某个地方发送和响应事件)。 - Colin M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接