簡體   English   中英

使用spring在Ibm Websphere MQ中實現重試邏輯

[英]Implementing retry logic in Ibm Websphere MQ with spring

我正在使用Spring和Webphere MQ處理以下配置以進行消息傳遞。

我需要為場景實現重試邏輯,我從隊列接收消息並將消息數據放到Elastic搜索服務器上(搜索服務器是非事務性的),如果搜索服務器關閉,我必須回滾再次向隊列發送消息,並在一段時間間隔后處理該消息(例如:30秒)。 這個重試必須完成5次。 5次之后,消息必須放在死信隊列中。我們使用Tomcat作為服務器。

我們使用spring integration jms:message-driven-channel-adapter進行消息接收

如何使用spring和Websphere MQ實現此行為?

我已遍歷了許多站點,我可以找到對Active MQ的支持,但不支持IBM MQ。

<bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
        <property name="hostName">
            <value>${queue_hostname}</value>
        </property>
        <property name="port">
            <value>${queue_port}</value>
        </property>
        <property name="queueManager">
            <value>${queue_manager}</value>
        </property>
        <property name="transportType">
            <value>1</value>
        </property>
    </bean>

    <!-- JMS Queue Connection Factory -->
    <bean id="jmsQueueConnectionFactory"
        class="org.springframework.jms.connection.SingleConnectionFactory102">
        <property name="targetConnectionFactory">
            <ref bean="mqConnectionFactory" />
        </property>
        <property name="pubSubDomain">
            <value>false</value>
        </property>
    </bean>

    <!-- JMS Destination Resolver -->
    <bean id="jmsDestinationResolver"
        class="org.springframework.jms.support.destination.DynamicDestinationResolver">
    </bean>

    <!-- JMS Queue Template -->
    <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate102">
        <property name="connectionFactory">
            <ref bean="jmsQueueConnectionFactory" />
        </property>
        <property name="destinationResolver">
            <ref bean="jmsDestinationResolver" />
        </property>
        <property name="pubSubDomain">
            <value>false</value>
        </property>
        <property name="receiveTimeout">
            <value>20000</value>
        </property>
    </bean>

JMS規范中沒有關於延遲重新傳遞的內容。 一些經紀人有自定義機制/政策來實施它; 你必須看看經紀人文件。

如前所述,您可以使用傳遞計數標題在經過一些重試后放棄。

編輯

回應下面的評論......

僅當您使用的是支持JMS 2.0的MQ版本時 - 看起來您使用的是需要JmsTemplate102舊版本。 1.0.2是古老的; 1.1已經出了多年; Spring已經支持JMS 2.0近3年了。 如果您有JMS 2.0代理(和客戶端庫),請在JmsTemplate bean上設置deliveryDelay 然后,配置出站通道適配器以通過jms-template屬性使用該模板。

為了獲得重新傳遞計數的可見性,要么將整個消息傳遞到您的服務中,要么使用POJO方法將其配置為獲取該標頭...

public MyReply process(@Payload MyObject foo,
              @Header("JMSXRedeliveryCount") int redeliveryCOunt) {
    ...
}

同樣,這是一個JMS 2.0功能(標題),盡管一些代理在1.1中提供它。

IBM MQ沒有延遲重新傳遞,但一種選擇是考慮使用延遲傳遞的JMS2.0概念。 這不會設置redelivered標志,因此不會使用任何退出邏輯,但它會實現定時行為。

例如,當無法處理消息時,應用程序可能會延遲重新排隊。 5分鍾后再也不會再看到這一點。 應用程序可能必須使用計數器標記消息。 兩者都可以在交易會話下完成

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM