使用DefaultMessageListenerContainer丢失来自主题的消息

时间:2012-06-01 13:18:00

标签: spring jms spring-jms

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

1)我在春天配置了一个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();

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

2 个答案:

答案 0 :(得分:2)

您的订阅看起来不耐用。如果是,则在您的子线程离线/启动时将保存消息。您的订阅者将从完全启动的点开始获取消息 - 之前发送的消息将丢失。

答案 1 :(得分:1)

经过一些测试后,我们在消费者创造过程中发现了竞争状况。消息没有丢失,它们没有在我们的代码中正确分发。