2012-07-11 91 views
0

我遇到的问题是这样的: 使用服务混合和骆驼路由我发送一个JSON消息通过activeMQ消费者。 问题是这个消费者处理这个消息的时间是X,因此消费者在消息消费期间可能会停止或崩溃。在这种情况下,消息将成为消费者的一半,并且已经从队列中删除,因为它已交付。ServiceMix,Apache ActiveMQ,骆驼发送“完成”消费消息

是否有可能使队列在消耗时不移除消息,而是等待消费者的某些确认消息,在删除消息之前完成此消息的处理?

在典型的文件系统导入文件中,您将删除文件或将其重命名为仅在文件完全处理完成并且事务完全提交时完成。那么,如何在ESB世界中,我们可以说,保持消息,直到我完成,我告诉你删除它。

我使用spring jms:listener-container和jms:listeners来消耗当前的消息。

回答

1

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

从ActiveMQ的一些注意事项吧here

你可以很容易地在JMS使用本地事务,并设置这样的监听器容器(上sessionTransacted注意真):

<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”方法成功返回(没有抛出异常),否则该事务将不会提交(=从队列中移除消息)。我想这是你想要的

相关问题