gpt4 book ai didi

spring - Spring Integration 中的非阻塞 TCP 连接

转载 作者:可可西里 更新时间:2023-11-01 02:54:17 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

您有多种选择:

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

最后一个有点复杂,取决于你是否使用 NIO。如果没有,提供自定义 TcpSocketFactorySupport 返回一个工厂,其中 createSocket(host, port) 实际上执行 createSocket()connect(套接字地址,超时)。如果您使用的是 NIO,则消息应该被缓冲并且在缓冲区已满之前不会阻塞。

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

关于spring - Spring Integration 中的非阻塞 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31174452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com