Spring 集成 - 使用 RoundRobin 和故障转移的两个永久连接
Spring Integration - Two permanents connections with RoundRobin and Failover
有可能(使用 Spring-Integration 的现有组件)有两个永久连接到两个不同的 TCP 服务器,这允许我们在连接之间进行循环,在这种情况下失败,尝试其他连接?
我们正在使用 FailoverClientConnectionFactory,它有两个 TcpNioClientConnectionFactory(每个连接到不同的服务器)。
但这意味着我们的应用程序以 50% 的速度工作。因为它使用共享连接,我们可以循环使用两个 TCP 服务器。
我正在为这种情况而苦苦挣扎。
我们考虑制作我们自己的 CustomRoundRobinFailoverConnectionFactory 或使用 IntegrationFlow 库,但也许这是更好的方法。
编辑 1 - 解决方案
@Bean
@ServiceActivator(inputChannel="outboundChannel")
public MessageHandler outboundGatewayOne() {
TcpOutboundGateway tcpOutboundGateway = new TcpOutboundGateway();
tcpOutboundGateway.setConnectionFactory(failoverClientConnectionFactoryOne);
return tcpOutboundGateway;
}
@Bean
@ServiceActivator(inputChannel="outboundChannel")
public MessageHandler outboundGatewayTwo() {
TcpOutboundGateway tcpOutboundGateway = new TcpOutboundGateway();
tcpOutboundGateway.setConnectionFactory(failoverClientConnectionFactoryTwo);
return tcpOutboundGateway;
}
@Bean
public MessageChannel outboundChannel() {
return new DirectChannel();
}
@MessagingGateway(defaultRequestChannel="outboundChannel")
public interface TcpClientGateway {
byte[] send(byte[] message);
}
所以这是有效的。但是现在,我想避免对两个 outboundGateways 进行硬编码。这是更好的方法吗?
我尝试对两个连接工厂使用相同的 outboundGateway 但不起作用。
- 回答:不,你不能。我们需要让两个 OutboundGateways 作为 DirectChannel 上的消费者来获得循环分配。每个网关都是一个消费者。
一个简单的解决方案是使用 2 个 FailoverClientConnectionFactory
个实例配置 2 个出站端点。
更改目标工厂的顺序。
FCCF1 -> server1, server2
FCCF2 -> server2, server1
使用相同的通道 (DirectChannel
) 作为端点的输入通道。
发送到该通道的消息将循环分发到两个端点。
有可能(使用 Spring-Integration 的现有组件)有两个永久连接到两个不同的 TCP 服务器,这允许我们在连接之间进行循环,在这种情况下失败,尝试其他连接?
我们正在使用 FailoverClientConnectionFactory,它有两个 TcpNioClientConnectionFactory(每个连接到不同的服务器)。 但这意味着我们的应用程序以 50% 的速度工作。因为它使用共享连接,我们可以循环使用两个 TCP 服务器。
我正在为这种情况而苦苦挣扎。 我们考虑制作我们自己的 CustomRoundRobinFailoverConnectionFactory 或使用 IntegrationFlow 库,但也许这是更好的方法。
编辑 1 - 解决方案
@Bean
@ServiceActivator(inputChannel="outboundChannel")
public MessageHandler outboundGatewayOne() {
TcpOutboundGateway tcpOutboundGateway = new TcpOutboundGateway();
tcpOutboundGateway.setConnectionFactory(failoverClientConnectionFactoryOne);
return tcpOutboundGateway;
}
@Bean
@ServiceActivator(inputChannel="outboundChannel")
public MessageHandler outboundGatewayTwo() {
TcpOutboundGateway tcpOutboundGateway = new TcpOutboundGateway();
tcpOutboundGateway.setConnectionFactory(failoverClientConnectionFactoryTwo);
return tcpOutboundGateway;
}
@Bean
public MessageChannel outboundChannel() {
return new DirectChannel();
}
@MessagingGateway(defaultRequestChannel="outboundChannel")
public interface TcpClientGateway {
byte[] send(byte[] message);
}
所以这是有效的。但是现在,我想避免对两个 outboundGateways 进行硬编码。这是更好的方法吗? 我尝试对两个连接工厂使用相同的 outboundGateway 但不起作用。
- 回答:不,你不能。我们需要让两个 OutboundGateways 作为 DirectChannel 上的消费者来获得循环分配。每个网关都是一个消费者。
一个简单的解决方案是使用 2 个 FailoverClientConnectionFactory
个实例配置 2 个出站端点。
更改目标工厂的顺序。
FCCF1 -> server1, server2
FCCF2 -> server2, server1
使用相同的通道 (DirectChannel
) 作为端点的输入通道。
发送到该通道的消息将循环分发到两个端点。