Spring 集成中的非阻塞 TCP 连接
Non blocking TCP connect in Spring Integration
我正在尝试使用 Spring 集成连接到不稳定网络上的大量设备 (500-1000),我遇到了 10 个任务调度程序的默认池阻止尝试连接到当前不可用的设备。
我的实现基于动态 FTP 示例,为每个具有客户端 tcp 连接工厂和 tcp 入站适配器的远程设备创建一个新的子应用程序上下文,消息路由到根上下文。
我遇到的问题是,快速连接这些设备很重要,但其中大量设备可能随时离线。
所有连接似乎都被发送到一个包含 10 个成员的任务调度程序池,并最终阻塞连接调用,导致连接到列表下方在线设备的大量延迟。
所以我的问题是,有没有办法使用 spring 集成来实现非阻塞连接调用?
非阻塞连接无济于事,因为连接是按需建立的,发送线程需要阻塞直到连接启用,尤其是在 request/reply 场景中。如果您使用通道适配器进行单向或任意双向通信(不使用出站网关)。您可以将您的请求放在队列通道中。
轮询器资源有限,最好不要直接在轮询器上 运行 长时间 运行 宁任务,而是交给任务执行器。
您有多种选择:
- 使用任务执行器,这样您就不会阻塞轮询线程。
- 增加调度程序池大小 - 定义您自己的
taskScheduler
bean,或者将属性文件添加到包含 spring.integraton.taskScheduler.poolSize=50
(或其他)的类路径 /META-INF/spring.integration.properties
。
- 减少 OS 上的默认连接超时。
最后一个有点复杂,取决于你是否使用 NIO。如果没有,请提供一个自定义 TcpSocketFactorySupport
,returns 一个 createSocket(host, port)
实际上做 createSocket()
和 connect(socketAdddress, timeout)
的工厂。如果您使用的是 NIO,消息应该被缓冲并且在缓冲区满之前不会阻塞。
编辑:我看到您正在使用入站适配器;我以为他们出境了。我假设您设置了 client-mode
。所以那里没有任务执行者选项;但另一种选择是将自定义任务调度程序配置到入站适配器中,这样您就不会使用主池。
我正在尝试使用 Spring 集成连接到不稳定网络上的大量设备 (500-1000),我遇到了 10 个任务调度程序的默认池阻止尝试连接到当前不可用的设备。
我的实现基于动态 FTP 示例,为每个具有客户端 tcp 连接工厂和 tcp 入站适配器的远程设备创建一个新的子应用程序上下文,消息路由到根上下文。
我遇到的问题是,快速连接这些设备很重要,但其中大量设备可能随时离线。
所有连接似乎都被发送到一个包含 10 个成员的任务调度程序池,并最终阻塞连接调用,导致连接到列表下方在线设备的大量延迟。
所以我的问题是,有没有办法使用 spring 集成来实现非阻塞连接调用?
非阻塞连接无济于事,因为连接是按需建立的,发送线程需要阻塞直到连接启用,尤其是在 request/reply 场景中。如果您使用通道适配器进行单向或任意双向通信(不使用出站网关)。您可以将您的请求放在队列通道中。
轮询器资源有限,最好不要直接在轮询器上 运行 长时间 运行 宁任务,而是交给任务执行器。
您有多种选择:
- 使用任务执行器,这样您就不会阻塞轮询线程。
- 增加调度程序池大小 - 定义您自己的
taskScheduler
bean,或者将属性文件添加到包含spring.integraton.taskScheduler.poolSize=50
(或其他)的类路径/META-INF/spring.integration.properties
。 - 减少 OS 上的默认连接超时。
最后一个有点复杂,取决于你是否使用 NIO。如果没有,请提供一个自定义 TcpSocketFactorySupport
,returns 一个 createSocket(host, port)
实际上做 createSocket()
和 connect(socketAdddress, timeout)
的工厂。如果您使用的是 NIO,消息应该被缓冲并且在缓冲区满之前不会阻塞。
编辑:我看到您正在使用入站适配器;我以为他们出境了。我假设您设置了 client-mode
。所以那里没有任务执行者选项;但另一种选择是将自定义任务调度程序配置到入站适配器中,这样您就不会使用主池。