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

时间:2019-03-28 18:20:10

标签: spring-integration

从继续对话 this question

此处分为两部分:

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

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

第一个消息一经建立便自动建立第一个连接 通过工厂。我们需要做的是在关注消息时注意 使用不同的ip_connectionId,建立新的连接,并进行路由 到该新连接的消息。显然,带有原始消息 ip_connectionId仍将路由到原始连接。

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

1 个答案:

答案 0 :(得分:1)

如果入站连接工厂是let snsData = { Message: < strong > "This is an automated message" < /strong> + '\n' + "You have successfully uploaded the following:" + '\n' `File name: ${snsFileName}\n Number of lines: ${numberOfLines}\n If there are any issues, please contact XXX for assistance.`, Subject: 'Successfully Uploaded to XX', TopicArn: 'XXXXX' };,则可以简单地使用TcpNetServerConnectionFactory,因为每个入站连接都有自己的线程。

您将致电ThreadAffinityClientConnectionFactory。这会将连接绑定到线程(并且您可以从中获取连接ID),但是由于线程亲和性,您实际上不需要在此方向上映射标头,您只需要映射在返回路径上

请记住,如果getConnection()检测到连接已关闭,它将创建一个新连接。因此,您可能希望每次调用都在映射器中调用ThreadAffinityClientConnectionFactory。但是,仍然会出现竞争状况,因此您可能还需要听getConnection()TcpConnectionCloseEvent的声音。

如果您在入站上使用NIO,或者通过执行程序将工作交给其他线程,则将无法工作。

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

但是,您需要了解一个技巧。

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

  • 首先,它告诉工厂在每次调用singleUse时创建一个新的连接,而不是单个共享的连接
  • 第二秒,它告诉入站适配器在收到回复后关闭连接

因此,诀窍是您需要在真实工厂上使用getConnection()(因此每次调用singleUse=true时都会为您提供一个新的连接),但是在包装工厂上需要getConnection(),因此适配器不要关闭连接。

我建议您查看singleUse=falseThreadAffinityClientConnectionFactory连接工厂以了解它们的工作原理。

我们可能应该考虑将其分为两个布尔值;我们还可以通过在客户端工厂合同中添加CachingClientConnectionFactory之类的内容,并让工厂在内部查找连接,来进行一些改进以避免使用本地线程。但这需要在适配器中进行操作。

我将为此捕获一个问题,看看是否可以在5.2中得到一些帮助。

答案很长,但是我希望这是有道理的。