当前位置: 首页 > 知识库问答 >
问题:

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

颜修真
2023-03-14

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

我没有找到任何这种类型的配置的例子。

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

try {
  primaryGateway.sendMessage(message);
} catch (Exception e) {
  secondaryGateway.sendMessage(message);
}

另外,我在尝试定义辅助连接工厂时遇到了一个问题。我不确定如何告诉队列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个答案

朱自明
2023-03-14

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

有关更多信息,请参见参考手册“直接通道”文档和配置

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

 类似资料:
  • 我正在尝试用6台机器实现一个Redis集群。我有一个由六台机器组成的流浪集群: 运行redis服务器 我编辑了上述所有服务器的/etc/redis/redis.conf文件,添加了这个 然后我在六台机器中的一台上运行了这个程序; Redis集群已启动并运行。我通过在一台机器上设置值手动检查它显示在其他机器上。 我的问题是,当我关闭或停止任何一台主机上的redis server时,整个集群都会停止运

  • 我们有一个mongodb副本集,其中包含两个实例(127.0.0.1:27017-主要,127.0.0.1:27018-次要)和一个仲裁器(127.0.0.1:27019)。当我使用rs.steppdown(60)从主实例中退出时,它应该成为辅助实例,辅助实例应该成为主实例,所有写操作都应该在辅助实例中发生(退出后的主实例)。但在卸任后,我遇到了一个异常“无法将数据写入传输连接:远程主机强制关闭了

  • 因此,如果我理解正确的话,在检测并重新启动失败代理的环境中运行Artemis代理集群将提供与运行每个活动服务器都与备份配对的集群相同的语义(以及类似的可用性)。对吗?

  • 我注意到,当连接的Artemis节点宕机时,连接到节点2-4的客户机不会故障转移到其他3个可用的主节点,基本上不会发现其他节点。即使在原始节点恢复之后,客户端仍然无法建立连接。我从一个单独的堆栈溢出帖子中看到,不支持主到主故障转移。这是否意味着对于每个主节点,我也需要创建一个从节点来处理故障转移?这是否会导致两个实例点失败,而不是集群中有许多节点? 在一个单独的基本测试中,使用一个主从两个节点的集

  • 目前,我正在使用ActiveMQ,并计划将系统迁移到ActiveMQ Artemis。目前,我有3个生产者和3个消费者,只有一个ActiveMQ服务器/代理。

  • 我们使用MQ作为传递消息的主要路径。这是我们的制度运作不可或缺的一部分。消息代理有时会失败,所有相关的队列也会随之失败。在camel中,有没有一种方法可以启动故障切换,并在其启动时恢复到主故障切换?