【问题标题】:DefaultMessageListenerContainer not receiving messagesDefaultMessageListenerContainer 未收到消息
【发布时间】:2014-02-17 02:13:33
【问题描述】:

我有一个 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 级别的日志记录。
  • @GaryRussell 我已启用跟踪。 ActiveMQ 本身似乎甚至没有记录任何内容,这表明订阅从未真正发生过(我怀疑)。查看 Spring 的源代码,我看到 SimpleMessageListenerContainer 有一个重写的 doStart 方法,它实际上创建了侦听器。我在DefaultMessageListenerContainer 中没有看到对应的代码,这很有趣。也许我错过了什么。
  • 是的,当然;你需要打电话给afterPropertiesSet()

标签: spring jms activemq spring-jms


【解决方案1】:

在 Java 中(在 Spring 应用程序上下文之外)构造容器时,需要在 start() 之前调用 afterPropertiesSet()

上下文自动为 Spring bean 执行此操作。

【讨论】:

  • 谢谢!这非常有效。现在我觉得自己很愚蠢。我本来只是通过上下文注册了所有内容,但是我在每个服务所依赖的共享库中都有这段代码,并且服务订阅了 Spring JMS 层之上的抽象(所以他们对 JMS 的存在一无所知- 他们只是从某个地方发送事件并对事件做出反应)。
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2023-03-30
  • 2018-05-15
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多