如何在Mule ESB中持久化包含Java消息的队列



我在Mule应用程序中使用JMS端点和Apache ActiveMQ(我遵循了一个教程,不确定依赖JMS作为端点是否做了正确的事情)

<jms:activemq-connector  name="jms-connector" brokerURL="${BrokerURL}" disableTemporaryReplyToDestinations="true" specification="1.1"/>
<jms:endpoint connector-ref="jms-connector" exchange-pattern="one-way" name="UnsortedOrders" queue="UnsortedOrders"/>                
<jms:endpoint connector-ref="jms-connector" exchange-pattern="one-way" name="DestinationEMC" queue="DestinationEMC" />                
<jms:endpoint connector-ref="jms-connector" exchange-pattern="one-way" name="DestinationOriginal" queue="DestinationOriginal"/>  

在这一点上,我需要自动存储(保存在磁盘上)与相关联的队列,这样电源故障和其他故障就不会永远杀死未完成的进程,并且一旦mule再次启动,进程就会继续。

我以前使用过带有标记的ObjectStore,但不知道如何将其与JMS端点队列绑定。这是我以前使用ObjectStore的方式:

    <spring:bean id="objectStore" class="org.mule.util.store.QueuePersistenceObjectStore"/>


    <until-successful objectStore-ref="objectStore" maxRetries="${MaximumRetry}" secondsBetweenRetries="${RetryInterval}">
        <http:outbound-endpoint address="${ECMURL}" exchange-pattern="one-way">             
            <transformer ref="contentTypeTextXML"/>
        </http:outbound-endpoint>
    </until-successful> 

您不能将对象存储绑定到JMS端点。也就是说,如果不覆盖ObjectStore实现。

但是,您可以使用JMS持久性来实现同样的目的。你必须使用交易。

<jms:inbound-endpoint queue="Destination.EMC" connector-ref="jms-connector">
    <jms:transaction action="ALWAYS_BEGIN"/>
</jms:inbound-endpoint>
<http:outbound-endpoint address="${ECMURL}" exchange-pattern="one-way">             
   <transformer ref="contentTypeTextXML"/>
</http:outbound-endpoint>

因此,如果您将消息放入队列,它将尝试发布到HTTP,如果失败,它将回滚到队列并重试。当所有尝试都已完成,但调用仍未成功时,消息将回滚到死信队列(默认情况下为ActiveMQ.DLQ)。

要控制消息重试的次数以及重试之间的延迟,可以使用重新传递策略。

您可以将重新交付策略详细信息添加到代理url中。即

tcp://localhost:61616?jms.redeliveryPolicy.maximumRedeliveries=${MaximumRetry}&jms.redeliveryPolicy.redeliveryDelay=${RetryIntervalInMilliseconds}

关于如何将ActiveMQ重新交付与Mule ESB一起使用,可以在Mule ESB博客中找到一个很好的解释。

最新更新