【问题标题】:Non blocking TCP connect in Spring IntegrationSpring集成中的非阻塞TCP连接
【发布时间】:2015-07-02 01:52:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的问题是当连接尝试连接到关机设备时需要太多时间才能返回反馈?。如果这是问题所在,只需减少您的请求的生存时间

标签: spring tcp spring-integration


【解决方案1】:

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

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

您有多种选择:

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

最后一点涉及更多,取决于您是否使用 NIO。如果没有,请提供一个自定义的TcpSocketFactorySupport,它返回一个工厂,其中createSocket(host, port) 实际执行createSocket()connect(socketAdddress, timeout)。如果您使用的是 NIO,则应缓冲消息,并且在缓冲区满之前不会阻塞。

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

【讨论】:

  • 嗨,Gary,是的,我正在使用客户端模式。感谢您的指点,我将对所有这些选项进行一些研究。我已经在考虑增加池并减少连接超时,但我有点不确定这将如何工作。再次感谢:)
猜你喜欢
  • 2014-06-07
  • 1970-01-01
  • 2011-05-31
  • 2014-02-03
  • 1970-01-01
  • 2017-04-18
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多