2

我对 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" />
4

1 回答 1

1

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

有关详细信息,请参阅参考手册“直接通道”文档配置

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

于 2013-07-11T16:29:38.623 回答