【问题标题】:ServiceMix, Apache ActiveMQ, Camel sending "done" for consuming messagesServiceMix、Apache ActiveMQ、Camel 为消费消息发送“完成”
【发布时间】:2012-07-11 04:13:21
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: jms activemq esb apache-servicemix


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

    【讨论】:

      猜你喜欢
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 2014-12-30
      • 2016-03-31
      • 2020-12-09
      • 1970-01-01
      相关资源
      最近更新 更多