我們有一個使用註釋爲基礎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 Gateway
的replyChannel
和sec以便我們可以進行數據庫更新等等。這裏的想法是,如果第一個收件人發送失敗(即,當響應隊列不可用時),後發送流程不執行,而是執行錯誤處理流程(例如errorChannel
流程)。但在描述錯誤的情況下,我們看到了警告日誌和流量的發送後流仍然執行,而不是errorChannel
的流...
就好像,在這一點上,JMS Inbound Gateway
的errorChannel
不再適用。它是否正確?這是預期的行爲?如果是這樣,這是否意味着我們應該使用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();
}