我是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 回答
出站适配器不会进行故障转移,但您可以将两个出站适配器连接到
lsmScheduleActualOutboundChannel
;默认情况下,框架将循环访问请求,但您可以通过使用load-balancer="none"
配置通道的<dispatcher/>
来更改该行为;如果第一个适配器失败,这将把消息发送到第二个适配器 .有关更多信息,请参阅Reference Manual 'Direct Channel' Documentation和Configuration
通道适配器具有
connection-factory
属性;如果没有提供,则默认为connectionFactory
.