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