0

我遇到的问题是:使用服务组合和骆驼路由,我通过 activeMQ 向消费者发送 JSON 消息。问题是该消费者处理此消息所花费的时间是 X,因此消费者在使用消息期间可能会停止或崩溃。在这种情况下,消息将是一半的消费者,并且已经从队列中删除,因为它已经被传递了。

是否可以使队列在消息被消费时不删除消息,而是等待消费者确认该消息的处理已完成,然后再删除它?

在从文件系统导入文件的典型情况下,您将删除文件或将其重命名为仅在文件已完全处理且事务已完全提交的末尾完成。那么在 ESB 世界中,我们可以说保留消息直到我完成,然后我告诉你删除它。

我目前正在使用 spring jms:listener-container 和 jms:listeners 来使用这些消息。

4

1 回答 1

1

您的问题是 JMS 事务每天解决的问题。

ActiveMQ 的一些注释在这里

您可以轻松地在 JMS 中使用本地事务,并像这样设置一个侦听器容器(请注意 sessionTransacted 上的 true):

<bean id="myListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="concurrentConsumers" value="1" />
    <property name="connectionFactory" ref="jmsConnectionFactory" />
    <property name="destination" ref="myQueue" />
    <property name="messageListener" ref="myConsumerBean" />
    <property name="sessionTransacted" value="true" />
</bean>

然后你有一个事务处理的会话。如果消息侦听器消费消息失败,消息将回滚到队列中。除非消息侦听器 bean 中的“onMessage”方法成功返回(不抛出异常),否则事务不会提交(=从队列中删除的消息)。我想这就是你想要的

于 2012-07-24T21:28:51.767 回答