Spring Integration中的非阻塞TCP连接

时间:2015-07-02 01:52:50

标签: spring tcp spring-integration

我正在尝试使用Spring Integration连接到易失性网络上的大量设备(500-1000),并且我遇到了10个任务调度程序的默认池阻塞尝试连接到非设备的问题目前可用。

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

我遇到的问题是这些设备连接很快很重要,但很多设备可能随时都处于脱机状态。

所有连接似乎都被发送到单个10成员任务调度程序池并最终阻止连接调用,从而导致大量延迟连接到列表中进一步联机的设备。

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

1 个答案:

答案 0 :(得分:0)

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

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

您有几种选择:

  1. 使用任务执行程序,这样就不会占用轮询线程。
  2. 增加调度程序池大小 - 定义您自己的taskScheduler bean,或者将属性文件添加到包含/META-INF/spring.integration.properties(或其他)的类路径spring.integraton.taskScheduler.poolSize=50
  3. 从操作系统的默认设置中减少连接超时。
  4. 最后一点涉及更多,取决于您是否使用NIO。如果没有,请提供一个自定义TcpSocketFactorySupport,返回createSocket(host, port)实际上createSocket()connect(socketAdddress, timeout)的工厂。如果您正在使用NIO,则应缓冲消息,并且在缓冲区已满之前不会阻塞消息。

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