2015-02-09 80 views
0

我使用JMS端點和Apache ActiveMQ的在我的騾子的應用程序(我按照教程,不知道我在做依託JMS作爲端點正確的事)如何在Mule ESB中保存包含Java消息的隊列?

<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> 

回答

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} 

如何ActiveMQ的再分發可以用騾子ESB可以使用一個很好的解釋可以在騾子ESB blog被發現。

+0

謝謝。好答案。那麼「Destination.EMC」在默認情況下會將持久(磁盤上)隊列排隊?我的意思是即使在停電時我也不會丟失數據,它們將被存儲在磁盤上? – MoienGK 2015-02-10 05:54:54

+0

是的,因爲您沒有禁用JMS提供程序(ActiveMQ)上的持久性。我想不是,除非你應該知道。您還應該發送持久性消息(默認情況下爲它們)。 – 2015-02-10 14:36:58