继续从谈话这个问题 :
两部分的问题在这里:
一个可以TcpNetClientConnectionFactory
有其上游服务器的多个连接,如果主机和端口是相同的?
如果是这样,我怎么能编程建立该连接工厂新的连接? 我看到buildNewConnection
方法,但它是受保护的。
第一连接被自动只要第一消息通过工厂建造。 我们需要做的是通知时以下消息有不同的ip_connectionId
,站在了一个新的连接和路由这些消息到新的连接。 显然,与原始邮件ip_connectionId
仍然会被路由到原来的连接。
不知道是否会更好地建立多个连接,关闭一个连接工厂,或者创造一个全新的连接工厂,发送消息处理器,和接收通道适配器为每个新连接。
如果入站连接工厂是TcpNetServerConnectionFactory
,你可以简单地使用ThreadAffinityClientConnectionFactory
因为每个入站连接都有自己的线程。
你会调用getConnection()
这将绑定到线程的连接(你可以从中获取连接ID),但你并不真的需要映射,因为线程关联的这个方向的头,你只需要映射在返回路径上。
请记住,虽然,如果ThreadAffinityClientConnectionFactory
检测到连接已经关闭,它会创建一个新的。 所以,你可能需要调用getConnection()
在每次调用您的映射。 但是,仍然会有竞争条件,所以您可能还需要监听TcpConnectionCloseEvent
S和TcpConnectionOpenEvent
秒。
如果您对入站使用NIO,或以其他方式通过执行手头宽裕的工作给其他线程,这是不行的。
在这种情况下,你需要自己的包装连接工厂-你可以使用ThreadAffinityClientConnectionFactory
作为一种模式,但不是存储在连接ThreadLocal
,你把它们存储在一个地图。 但是你仍旧需要一个ThreadLocal
(上游设置在每次调用)告诉工厂来伸手,其连接时,适配器请求之一。
还有,你需要知道的,但是一招。
有一个属性singleUse
连接工厂。 这用于2个目的;
- 第一,它告诉工厂每次创建一个新的连接
getConnection()
代替称为单,共享的,连接的 - 第二,它告诉了入站适配器关闭连接收到回复后
因此,关键是你需要singleUse=true
对实体工厂(所以它给你一个新的连接每次getConnection()
被调用),但singleUse=false
的包装厂,因此适配器不关闭连接。
我建议你看看ThreadAffinityClientConnectionFactory
和CachingClientConnectionFactory
连接工厂,看看他们是如何工作的。
也许我们应该考虑这个分成两个布尔值; 我们也许可以同时做一些改进,以避免当地一个线程需要通过添加类似getConnection(String connectionId)
到客户工厂的合同,并有工厂查找连接内部; 但是,需要在适配器的工作。
我会抓住一个问题,对于这一点,看看我们是否能在5.2得到的东西。
而是一个长的答案,但我希望这是有道理的。
文章来源: Programmatically create multiple connections for TcpNetClientConnectionFactory