我在我的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再次启动,该过程就会继续。
我之前使用过带Object的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>
答案 0 :(得分:1)
您无法将对象库绑定到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
。
要控制重试邮件的次数以及重试之间的延迟,您可以使用redelivery policy。
您可以将重新传递策略详细信息添加到代理网址。即。
tcp://localhost:61616?jms.redeliveryPolicy.maximumRedeliveries=${MaximumRetry}&jms.redeliveryPolicy.redeliveryDelay=${RetryIntervalInMilliseconds}
可以在Mule ESB blog上找到有关ActiveMQ重新传递如何与Mule ESB一起使用的详细说明。