【问题标题】:Losing messages from a topic with DefaultMessageListenerContainer使用 DefaultMessageListenerContainer 从主题中丢失消息
【发布时间】:2012-06-06 17:47:14
【问题描述】:

我正在使用 DefaultMessageListenerContainer 来使用来自主题的消息(代理是 ActiveMQ)。因为消费者是在运行时创建的,所以我正在执行以下操作:

1) 我在 spring 中配置了一个 Conainer 模板

<bean id="topiccontainertemplate" class="org.springframework.jms.listener.DefaultMessageListenerContainer" scope="prototype" destroy-method="stop">
    <property name="connectionFactory" ref="connectionfactory" />
    <property name="pubSubDomain" value="true" />
    <property name="cacheLevelName" value="CACHE_CONSUMER" />
    <property name="destinationName" value="default" />
</bean>

2) 当需要一个新的消费者时,我会从应用程序上下文中获取一个新的消费者并重新配置destinationName。

DefaultMessageListenerContainer container = context.getBean("topiccontainertemplate", DefaultMessageListenerContainer.class);
container.setDestinationName(localEntity.getId().getDestination());
container.setMessageListener(getListener());
container.start();

不幸的是,容器错过了有关该主题的一些消息。 有人知道我在做什么错吗?

【问题讨论】:

  • “一些消息”是什么意思?它们是初始消息还是间歇性消息?
  • @sully6768 它不是最初的消息。中间的一些消息似乎消失了(我还在调查)。

标签: spring jms spring-jms


【解决方案1】:

您的订阅看起来不耐用。如果是这样,当您的潜艇离线/启动时,消息将被保存。您的订阅者将从完全启动的那一刻开始收到消息 - 在此之前发送的消息将丢失。

【讨论】:

    【解决方案2】:

    在进行更多测试后,我们在创建消费者时发现了一个竞争条件。消息没有丢失,它们没有在我们的代码中正确分发。

    【讨论】:

    • 如果缓存级别低于 CACHE_CONSUMERS,它们可能会丢失。正如Petter 上面所说,在消费者娱乐期间,所有非持久订阅的消息都会丢失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2015-08-28
    • 2023-03-09
    • 1970-01-01
    • 2015-03-28
    • 2014-02-17
    • 1970-01-01
    相关资源
    最近更新 更多