Spring integration 以编程方式为TcpNetClientConnectionFactory创建多个连接

Spring integration 以编程方式为TcpNetClientConnectionFactory创建多个连接,spring-integration,Spring Integration,继续从 : 问题分为两部分: TcpNetClientConnectionFactory是否可以与其上游有多个连接 服务器,如果主机和端口相同 如果是这样,如何以编程方式为该连接构建新连接 工厂?我看到了buildNewConnection方法,但它是受保护的 第一条消息发出后,将自动建立第一个连接 穿过工厂。我们需要做的是注意以下消息 使用不同的ip\U连接ID,建立一个新连接,然后路由这些连接 向新连接发送消息。显然,消息与原始 ip\u connectionId仍将路由到原始连接 不确定在

继续从 :

问题分为两部分:

TcpNetClientConnectionFactory
是否可以与其上游有多个连接 服务器,如果主机和端口相同

如果是这样,如何以编程方式为该连接构建新连接 工厂?我看到了
buildNewConnection
方法,但它是受保护的

第一条消息发出后,将自动建立第一个连接 穿过工厂。我们需要做的是注意以下消息 使用不同的
ip\U连接ID
,建立一个新连接,然后路由这些连接 向新连接发送消息。显然,消息与原始
ip\u connectionId
仍将路由到原始连接

不确定在一个连接上创建多个连接是否更好 连接工厂,或创建一个全新的连接工厂,发送消息
处理程序和每个新连接的接收通道适配器。

如果入站连接工厂是
TcpNetServerConnectionFactory
,您只需使用
ThreadAffinityClientConnectionFactory
,因为每个入站连接都有自己的线程

您可以调用
getConnection()
。这会将连接绑定到线程(您可以从中获取连接id),但由于线程的关联性,您实际上不需要将头映射到此方向,您只需要映射到返回路径

但是请记住,如果
ThreadAffinityClientConnectionFactory
检测到连接已关闭,它将创建一个新的连接。因此,您可能希望在每次调用时在映射器中调用
getConnection()
。但是,仍然存在争用条件,因此您可能还需要侦听
TcpConnectionCloseEvent
s和
TcpConnectionOpenEvent
s

如果在入站线程上使用NIO,或者通过执行器将工作移交给其他线程,那么这将不起作用

在这种情况下,您将需要自己的包装连接工厂-您可以使用
ThreadAffinityClientConnectionFactory
作为模型,但您不需要将连接存储在
ThreadLocal
中,而是将它们存储在映射中。但是您仍然需要一个
ThreadLocal
(在每次调用时设置为上游)来告诉工厂在适配器请求连接时要分发哪个连接

然而,有一个技巧你需要注意

连接工厂上有一个属性
singleUse
。这有两个目的

  • 首先,它告诉工厂在每次调用
    getConnection()
    时创建一个新连接,而不是单个共享连接
  • 其次,它告诉入站适配器在收到回复后关闭连接
因此,诀窍是在真正的工厂上需要
singleUse=true
(因此每次调用
getConnection()
时它都会给您一个新的连接),但在包装工厂上需要
singleUse=false
,这样适配器就不会关闭连接

我建议您查看
ThreadAffinityClientConnectionFactory
CachingClientConnectionFactory
连接工厂,看看它们是如何工作的

我们应该考虑把这个分解成两个布尔代数;我们可能还可以做一些改进,通过向客户机工厂合同中添加类似于
getConnection(stringconnectionid)
的内容,并让工厂在内部查找连接,来避免对线程本地的需要;但这需要在适配器中进行工作

我将为此捕获一个问题,看看是否可以在5.2中获得一些内容

答案相当长,但我希望它有意义