Spring 集成中的非阻塞 TCP 连接

Non blocking TCP connect in Spring Integration

我正在尝试使用 Spring 集成连接到不稳定网络上的大量设备 (500-1000),我遇到了 10 个任务调度程序的默认池阻止尝试连接到当前不可用的设备。

我的实现基于动态 FTP 示例,为每个具有客户端 tcp 连接工厂和 tcp 入站适配器的远程设备创建一个新的子应用程序上下文,消息路由到根上下文。

我遇到的问题是,快速连接这些设备很重要,但其中大量设备可能随时离线。

所有连接似乎都被发送到一个包含 10 个成员的任务调度程序池,并最终阻塞连接调用,导致连接到列表下方在线设备的大量延迟。

所以我的问题是,有没有办法使用 spring 集成来实现非阻塞连接调用?

非阻塞连接无济于事,因为连接是按需建立的,发送线程需要阻塞直到连接启用,尤其是在 request/reply 场景中。如果您使用通道适配器进行单向或任意双向通信(不使用出站网关)。您可以将您的请求放在队列通道中。

轮询器资源有限,最好不要直接在轮询器上 运行 长时间 运行 宁任务,而是交给任务执行器。

您有多种选择:

  1. 使用任务执行器,这样您就不会阻塞轮询线程。
  2. 增加调度程序池大小 - 定义您自己的 taskScheduler bean,或者将属性文件添加到包含 spring.integraton.taskScheduler.poolSize=50(或其他)的类路径 /META-INF/spring.integration.properties
  3. 减少 OS 上的默认连接超时。

最后一个有点复杂,取决于你是否使用 NIO。如果没有,请提供一个自定义 TcpSocketFactorySupport,returns 一个 createSocket(host, port) 实际上做 createSocket()connect(socketAdddress, timeout) 的工厂。如果您使用的是 NIO,消息应该被缓冲并且在缓冲区满之前不会阻塞。

编辑:我看到您正在使用入站适配器;我以为他们出境了。我假设您设置了 client-mode。所以那里没有任务执行者选项;但另一种选择是将自定义任务调度程序配置到入站适配器中,这样您就不会使用主池。