2013-07-11 40 views
1

我對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" /> 

回答

1

出站適配器不會失敗結束,但可以連線2個的出站適配器lsmScheduleActualOutboundChannel;默認情況下,框架將循環請求,但您可以通過配置頻道的<dispatcher/>load-balancer="none"來更改該行爲;如果第一個適配器出現故障,它會將消息發送給第二個適配器。

更多信息請見

通道適配器具有connection-factory屬性Reference Manual 'Direct Channel' DocumentationConfiguration;如果未提供,則默認爲connectionFactory

+0

完美!我認爲會有一個比我想要的簡單(更優雅)的解決方案。我只是測試了「故障轉移」,它的運行非常好。非常感謝! – Steve

+0

很酷 - 你也可能想看看爲第一個適配器增加一個Circuit Breaker Advice。這樣,當它發生故障時,而不是爲每條消息進行嘗試,而是每隔一段時間嘗試一次。 http://static.springsource.org/spring-integration/reference/html/messaging-endpoints-chapter.html#circuit-breaker-advice –