从继续对话 this question:
此处分为两部分:
TcpNetClientConnectionFactory
可以与其上游有多个连接吗?
服务器,如果主机和端口相同?
如果是这样,我如何以编程方式为该连接建立新连接
厂?我看到了buildNewConnection
方法,但是它是受保护的。
第一个消息一经建立便自动建立第一个连接
通过工厂。我们需要做的是在关注消息时注意
使用不同的ip_connectionId
,建立新的连接,并进行路由
到该新连接的消息。显然,带有原始消息
ip_connectionId
仍将路由到原始连接。
不确定从一个连接创建多个连接是否更好 连接工厂,或创建一个全新的连接工厂,发送消息 处理程序,并为每个新连接接收通道适配器。
答案 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=false
和ThreadAffinityClientConnectionFactory
连接工厂以了解它们的工作原理。
我们可能应该考虑将其分为两个布尔值;我们还可以通过在客户端工厂合同中添加CachingClientConnectionFactory
之类的内容,并让工厂在内部查找连接,来进行一些改进以避免使用本地线程。但这需要在适配器中进行操作。
我将为此捕获一个问题,看看是否可以在5.2中得到一些帮助。
答案很长,但是我希望这是有道理的。