首页 文章

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

提问于
浏览
1

我是Spring Integration的新手 . 我有一个连接到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" />

1 回答

  • 1

    出站适配器不会进行故障转移,但您可以将两个出站适配器连接到 lsmScheduleActualOutboundChannel ;默认情况下,框架将循环访问请求,但您可以通过使用 load-balancer="none" 配置通道的 <dispatcher/> 来更改该行为;如果第一个适配器失败,这将把消息发送到第二个适配器 .

    有关更多信息,请参阅Reference Manual 'Direct Channel' DocumentationConfiguration

    通道适配器具有 connection-factory 属性;如果没有提供,则默认为 connectionFactory .

相关问题