2015-10-06 44 views
1

我們有一個使用註釋爲基礎spring:4.2.x的API,spring-integration:4.2.x API和spring-integration-java-dsl:1.1.0 API從WebSphere MQ隊列接收消息的EIP流量,做一些處理,最終返回錯誤處理對另一個Websphere MQ隊列的響應。對於此流程,我們使用JMS Inbound Gateway來同步接收來自一個隊列的消息,處理它們並將響應發送回另一個隊列。JMS入站網關 - 當回覆目標隊列發送是不可能的

JMS Inbound Gateway配置了errorChannel,因此RuntimeException被路由到它(這很好地工作)。然而,在測試期間,當我們故意在流的響應Websphere MQ隊列上應用PUT_INHIBIT(即導致流無法將響應發送迴應答隊列)時,彈簧日誌將顯示以下WARNING日誌消息:

WARN ... - Execution of JMS message listener failed, and no ErrorHandler has been set. javax.jms.JMSException: MQJMS2007: failed to send message to MQ queue.

我們知道我們可以通過配置在MLC本身,而是,之所以這樣一個ErrorHandler刪除WARNING日誌是導致我們的問題是,當我們的路線回一個響應,我們實際上航線使用.routeToRecipients()電話與.setIgnoreFailures(false)和兩個收件人 - 第一個收件人路由到JMS Inbound GatewayreplyChannel和sec以便我們可以進行數據庫更新等等。這裏的想法是,如果第一個收件人發送失敗(即,當響應隊列不可用時),後發送流程不執行,而是執行錯誤處理流程(例如errorChannel流程)。但在描述錯誤的情況下,我們看到了警告日誌和流量的發送後流仍然執行,而不是errorChannel的流...

就好像,在這一點上,JMS Inbound GatewayerrorChannel不再適用。它是否正確?這是預期的行爲?如果是這樣,這是否意味着我們應該使用Inbound/Outbound Adapter s而不是Inbound Gateway作爲回覆發送後意向?

JMS MLC配置:

@Bean(destroyMethod = "shutdown") 
public DefaultMessageListenerContainer serviceMLC() throws Exception { 

    DefaultMessageListenerContainer mlc = new DefaultMessageListenerContainer(); 
    mlc.setAutoStartup(false); 
    mlc.setConnectionFactory(serviceCCF); 
    mlc.setDestination(requestMqQueue); 
    mlc.setAcceptMessagesWhileStopping(false); 
    return mlc; 
} 

JMS入站網關配置:

@Bean 
public IntegrationFlow serviceFlow() { 

    return IntegrationFlows 
      .from(Jms 
        .inboundGateway(serviceMLC) 
        .autoStartup(true) 
        .defaultReplyDestination(responseMqQueue) 
        .replyChannel(responseOutCh) 
        .replyTimeout(180000) 
        .correlationKey("JMSCorrelationID") 
        .errorChannel(serviceErrorCh) 
        ) 
      .channel(serviceInCh) 
      .get(); 
} 

回答

1

是;網關不以那種方式工作。

當您將回復發送到網關時,它會在網關中排隊,直到線程返回到網關;此時,答覆將被提取併發送。因此,發送失敗不會發生,直到稍後(調用第二個收件人流後)。

是的,要做你想做的事情,你應該使用通道適配器,因爲失敗將直接在調用線程上運行。

相關問題