编程创建TcpNetClientConnectionFactory多个连接(Programmatic

2019-10-29 18:45发布

继续从谈话这个问题 :

两部分的问题在这里:

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

如果是这样,我怎么能编程建立该连接工厂新的连接? 我看到buildNewConnection方法,但它是受保护的。

第一连接被自动只要第一消息通过工厂建造。 我们需要做的是通知时以下消息有不同的ip_connectionId ,站在了一个新的连接和路由这些消息到新的连接。 显然,与原始邮件ip_connectionId仍然会被路由到原来的连接。

不知道是否会更好地建立多个连接,关闭一个连接工厂,或者创造一个全新的连接工厂,发送消息处理器,和接收通道适配器为每个新连接。

Answer 1:

如果入站连接工厂是TcpNetServerConnectionFactory ,你可以简单地使用ThreadAffinityClientConnectionFactory因为每个入站连接都有自己的线程。

你会调用getConnection() 这将绑定到线程的连接(你可以从中获取连接ID),但你并不真的需要映射,因为线程关联的这个方向的头,你只需要映射在返回路径上。

请记住,虽然,如果ThreadAffinityClientConnectionFactory检测到连接已经关闭,它会创建一个新的。 所以,你可能需要调用getConnection()在每次调用您的映射。 但是,仍然会有竞争条件,所以您可能还需要监听TcpConnectionCloseEvent S和TcpConnectionOpenEvent秒。

如果您对入站使用NIO,或以其他方式通过执行手头宽裕的工作给其他线程,这是不行的。

在这种情况下,你需要自己的包装连接工厂-你可以使用ThreadAffinityClientConnectionFactory作为一种模式,但不是存储在连接ThreadLocal ,你把它们存储在一个地图。 但是你仍旧需要一个ThreadLocal (上游设置在每次调用)告诉工厂来伸手,其连接时,适配器请求之一。

还有,你需要知道的,但是一招。

有一个属性singleUse连接工厂。 这用于2个目的;

  • 第一,它告诉工厂每次创建一个新的连接getConnection()代替称为单,共享的,连接的
  • 第二,它告诉了入站适配器关闭连接收到回复后

因此,关键是你需要singleUse=true对实体工厂(所以它给你一个新的连接每次getConnection()被调用),但singleUse=false的包装厂,因此适配器不关闭连接。

我建议你看看ThreadAffinityClientConnectionFactoryCachingClientConnectionFactory连接工厂,看看他们是如何工作的。

也许我们应该考虑这个分成两个布尔值; 我们也许可以同时做一些改进,以避免当地一个线程需要通过添加类似getConnection(String connectionId)到客户工厂的合同,并有工厂查找连接内部; 但是,需要在适配器的工作。

我会抓住一个问题,对于这一点,看看我们是否能在5.2得到的东西。

而是一个长的答案,但我希望这是有道理的。



文章来源: Programmatically create multiple connections for TcpNetClientConnectionFactory