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