具有 CLIENT_ACKNOWLEDGE 模式的骡子 jms?即使我没有确认消息也会自动使用

Posted

技术标签:

【中文标题】具有 CLIENT_ACKNOWLEDGE 模式的骡子 jms?即使我没有确认消息也会自动使用【英文标题】:Mule jms with CLIENT_ACKNOWLEDGE mode? Message automatically consumed even though I didn't acknoeledge it 【发布时间】:2014-10-20 03:21:27 【问题描述】:

我用 CLIENT_ACKNOWLEDGE 模式创建了一个简单的 mule JMS 流。我对“CLIENT_ACKNOWLEDGE”的理解是,我们必须在接收方或客户端显式确认消息,它不会从队列中消耗,直到它不会确认。

 <spring:beans>
        <spring:bean name="connectionFactory"
            class="org.apache.activemq.ActiveMQConnectionFactory">
            <spring:property name="brokerURL" value="tcp://localhost:61616" />
            <spring:property name="redeliveryPolicy">
                <spring:bean class="org.apache.activemq.RedeliveryPolicy">
                    <spring:property name="maximumRedeliveries" value="10" />
                    <spring:property name="initialRedeliveryDelay"
                        value="1000" />
                </spring:bean>
            </spring:property>
        </spring:bean>
        </spring:beans>
    <jms:connector name="Active_MQ3" connectionFactory-ref="connectionFactory" acknowledgementMode="CLIENT_ACKNOWLEDGE" maxRedelivery="10" persistentDelivery="true" specification="1.1" />



<flow name="main1" doc:name="main1">
                <http:inbound-endpoint exchange-pattern="request-response" host="localhost" path="test" port="8099" doc:name="HTTP"/>

                <logger message="starting main flow" level="INFO" doc:name="Logger"/>

                    <jms:outbound-endpoint queue="StudioIN" connector-ref="Active_MQ3" doc:name="JMS">
                         <jms:transaction action="NONE"/>
                    </jms:outbound-endpoint>

            </flow>

          //reading msg from queue, not acknowledging 

            <flow name="worker1" doc:name="worker1">
                <jms:inbound-endpoint queue="StudioIN" connector-ref="Active_MQ1" doc:name="JMS"/>
                <logger message="Consuming payload: #[payload]" level="INFO" doc:name="Logger"/>
            </flow>
        </mule>

在我的测试流程中,我没有确认消息,但它仍然被消耗掉了。我们如何将消息保留在队列中,直到它得到客户端或接收方的确认?

<!-------------- Updated flow ------------------------>
<flow name="worker1" doc:name="worker1">
        <jms:inbound-endpoint queue="StudioIN" connector-ref="Active_MQ1" doc:name="JMS">
            <jms:client-ack-transaction action="ALWAYS_BEGIN"/>
        </jms:inbound-endpoint>
        <logger message="Consuming payload: #[payload]" level="INFO" doc:name="Logger"/>
    </flow>

【问题讨论】:

【参考方案1】:

您的 JMS 入站端点中缺少 client-ack-transaction 元素。

文档在这个主题上非常薄:http://www.mulesoft.org/documentation/display/current/JMS+Transport+Reference#JMSTransportReference-Clientacktransaction

我打算为您提供使用此标签的集成测试链接,但找不到任何链接:(请参阅:https://github.com/mulesoft/mule/search?utf8=%E2%9C%93&q=client-ack-transaction&type=Code

【讨论】:

感谢您的回复。我已经尝试使用 选项,但它仍然会自动消耗而无需任何确认。我认为我们应该有一些东西可以帮助调用消息的确认方法。我已经用流程“worker1”更新了我的帖子。 如果流程成功,消息将被Mule自动客户端确认。尝试抛出异常并查看消息是否仍在消耗。 太棒了,现在我可以执行代码,并且如果遇到异常,消息不会消耗。在同一页面上,我还有两个问题:1)确认来自 flow-worker1 的消息的最佳方式是什么,无论是否捕获到异常。我想确认来自 worker1 流的消息,以便继续执行流。 2)如果我使用client-ack-transaction,它会使我的流程同步还是异步? (因为在 mule 事务中它强制流是同步的) 对不起,我没有看到这些。在回答 cmets 中提出的问题可能会被忽视。 1)您不能显式确认消息,您可以捕获异常,以便流程正常结束并完成确认。 2) 它将是同步的。 只是为了更新一些新信息,您可以通过此处的说明确认消息:support.mulesoft.com/s/article/ka4340000004GaCAAU/…

以上是关于具有 CLIENT_ACKNOWLEDGE 模式的骡子 jms?即使我没有确认消息也会自动使用的主要内容,如果未能解决你的问题,请参考以下文章

SQS 队列中的确认消息

ActiveMQ(20):Consumer高级特性之重新投递(Redelivery Policy)

使用多个数据库各自具有一个模式,还是使用一个数据库具有多个模式更好?

将复合模式转换为具有附加行为的新模式

具有编辑模式和查看模式的反应组件,这是正确的模式吗?

具有多个级别的雪花模式