Spring integration 如何定义故障转移spring集成网关?

Spring integration 如何定义故障转移spring集成网关?,spring-integration,gateway,Spring Integration,Gateway,我对Spring集成相当陌生。我有一个连接到JMS队列的通道。然后,我定义了一个网关,将该通道设置为默认请求通道 这个基本配置对我来说完美无瑕。已定义的服务接口被注入到我的bean中,我能够通过这个接口发送消息,消息一直传递到队列 但是,我还需要定义一个故障转移队列,如果由于某种原因无法访问主队列,则将尝试发送到故障转移/辅助队列 我没有发现任何此类配置的示例 由于我的通道连接到JMS队列,所以我的第一个想法是创建另一个连接工厂(指向辅助JMS服务器),创建另一个队列bean和通道,然后创建另一

我对Spring集成相当陌生。我有一个连接到JMS队列的通道。然后,我定义了一个网关,将该通道设置为默认请求通道

这个基本配置对我来说完美无瑕。已定义的服务接口被注入到我的bean中,我能够通过这个接口发送消息,消息一直传递到队列

但是,我还需要定义一个故障转移队列,如果由于某种原因无法访问主队列,则将尝试发送到故障转移/辅助队列

我没有发现任何此类配置的示例

由于我的通道连接到JMS队列,所以我的第一个想法是创建另一个连接工厂(指向辅助JMS服务器),创建另一个队列bean和通道,然后创建另一个网关,如果第一次网关调用引发异常,将使用该网关

try {
  primaryGateway.sendMessage(message);
} catch (Exception e) {
  secondaryGateway.sendMessage(message);
}
然而,我开始怀疑是否有一种内置的(隐藏的)方式,可以将spring集成配置为在发送到主队列失败时自动尝试辅助队列

另外,我在定义辅助连接工厂时遇到了问题。我不知道如何告诉队列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" />

出站适配器不会故障转移,但您可以将两个出站适配器连接到
lsmScheduleActualOutboundChannel
;默认情况下,框架将循环请求,但您可以通过使用
load balancer=“none”
配置通道的
来改变该行为;如果第一个适配器失败,这将向第二个适配器发送消息

有关更多信息,请参阅和


通道适配器具有
连接工厂
属性;如果未提供,则默认为
连接工厂

完美!我想会有一个比我所尝试的更简单(更优雅)的解决方案。我刚刚测试了“故障切换”,它工作得很好。多谢!酷-您可能还想看看向第一个适配器添加
断路器建议。这样,当它关闭时,您可以不必为每条消息都尝试它,而可以经常尝试它。