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中获得一些内容
答案相当长,但我希望它有意义