我遇到的问题是: 使用服务混合和驼峰路由我通过activeMQ向消费者发送JSON消息。 问题是此消费者处理此消息所花费的时间是X,因此消费者在消费消息期间可能会停止或崩溃。在这种情况下,消息将是一半消费者,并且已经从队列中删除,因为它已经被传递。
是否可以让队列在消费时不删除消息,而是等待消费者确认在删除消息之前完成此消息的处理?
在典型的文件系统导入文件中,您将删除文件或将其重命名为仅在文件完全处理完毕并且事务完全提交的最后文件。那么在ESB世界中我们如何能够保持信息直到我完成,并告诉你将其删除。
我正在使用spring jms:listener-container和jms:目前使用此消息的侦听器。
答案 0 :(得分:1)
您的问题是JMS事务每天解决的问题。
ActiveMQ的一些注释here
您可以在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”方法成功返回(没有抛出异常),否则事务不会提交(=从队列中删除消息)。我猜这就是你想要的