我對Spring Integration相當陌生。我有一個連接到JMS隊列的通道。然後我定義了一個網關,將該通道設置爲默認請求通道。如何定義故障切換彈簧集成網關?
這個基本配置對我來說工作完美無瑕。定義的服務接口被注入到我的bean中,並且我能夠通過這個接口發送一條消息,並且一直到隊列中。
但是,我有一個額外的要求,即定義一個故障轉移隊列,如果由於某種原因主服務器不可訪問,則會嘗試發送到故障轉移/輔助隊列。
我沒有找到任何這種類型的配置的例子。
由於我的通道連接到JMS隊列,我的第一個想法是創建另一個連接工廠(指向輔助JMS服務器),創建另一個隊列Bean和通道,然後有另一個網關,如果發生異常從第一個網關調用拋出。
try {
primaryGateway.sendMessage(message);
} catch (Exception e) {
secondaryGateway.sendMessage(message);
}
不過,我開始懷疑是否有一個內置的(在最蓋)的方式,Spring集成可以被配置爲autmatically嘗試第二隊列如果發送到主失敗。
此外,我嘗試定義一個輔助連接工廠時遇到問題。我不知道如何告訴隊列bean(或他們自己的渠道)使用哪個連接工廠。如果我沒有使用默認的「connectionFactory」ID,那是抱怨。
這是我的配置只用單個隊列/信道/定義網關的關鍵部分:
<bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="transportType" value="1"/>
<property name="hostName" value="${lsm.primary.sch.outbound.host}"/>
<property name="port" value="${lsm.primary.sch.outbound.port}"/>
<property name="queueManager" value="${lsm.primary.sch.outbound.manager}"/>
<property name="channel" value="${lsm.primary.sch.outbound.channel}"/>
</bean>
<bean id="connectionFactory"
class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="mqConnectionFactory" />
<property name="username" value="blah" />
<property name="password" value="blah" />
</bean>
<bean id="lsmScheduleActualOutboundQueue" class="com.ibm.mq.jms.MQQueue">
<property name="baseQueueManagerName" value="${lsm.primary.sch.outbound.manager}"/>
<property name="baseQueueName" value="${lsm.primary.sch.outbound.queue}"/>
</bean>
<int:channel id="lsmScheduleActualOutboundChannel" />
<jms:outbound-channel-adapter id="jmsOutboundAdapter"
channel="lsmScheduleActualOutboundChannel"
destination="lsmScheduleActualOutboundQueue" />
<int:gateway id="lsmScheduleActualOutboundGateway"
service-interface="com.myapp.service.LSMScheduleActualsGateway"
default-request-channel="lsmScheduleActualOutboundChannel"
default-request-timeout="1000" />
完美!我認爲會有一個比我想要的簡單(更優雅)的解決方案。我只是測試了「故障轉移」,它的運行非常好。非常感謝! – Steve
很酷 - 你也可能想看看爲第一個適配器增加一個Circuit Breaker Advice。這樣,當它發生故障時,而不是爲每條消息進行嘗試,而是每隔一段時間嘗試一次。 http://static.springsource.org/spring-integration/reference/html/messaging-endpoints-chapter.html#circuit-breaker-advice –