spring-integration - 使用客户端 ConnectionFactory 停止 TCP 适配器
问题描述
我正在尝试使用控制总线命令停止带有客户端连接工厂的 TCP 适配器,即@AdapterID.stop()
创建流的代码如下:
IntegrationFlow flow = IntegrationFlows.from(Tcp.inboundAdapter(Tcp.nioClient("127.0.0.1",3226))
.serializer(customSerializer)
.deserializer(customSerializer)
.id("abc")).clientMode(true).retryInterval(1000).errorChannel("testChannel"))
.enrichHeaders(f->f.header("abc","abc"))
.channel(directChannel())
.handle(Jms.outboundAdapter(ConnectionFactory())
.destination(hostConnection.getConnectionNumber()))
.get();
theFlow = this.flowContext.registration(flow).id("out.flow").register();
当我使用控制总线停止适配器时:
public String stopConnectionAdapter(String connectionName) {
MessageChannel controlChannel = ac.getBean("controlBus.input", MessageChannel.class);
String exp = "@"+connectionName+".stop()";
controlChannel.send(new GenericMessage<String>(exp));
return "STOPPED";
}
适配器已停止,但控制台上始终会打印以下异常
2018-06-04 11:09:45.551 ERROR 34860 --- [ask-scheduler-7] o.s.i.i.t.c.ClientModeConnectionManager : Could not establish connection using conncr3, host=127.0.0.1, port=3226
java.io.IOException: conncr3, host=127.0.0.1, port=3226 connection factory has not been started
at org.springframework.integration.ip.tcp.connection.AbstractConnectionFactory.checkActive(AbstractConnectionFactory.java:873) ~[spring-integration-ip-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory.checkActive(TcpNioClientConnectionFactory.java:68) ~[spring-integration-ip-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory.getConnection(AbstractClientConnectionFactory.java:68) ~[spring-integration-ip-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory.getConnection(AbstractClientConnectionFactory.java:33) ~[spring-integration-ip-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.integration.ip.tcp.connection.ClientModeConnectionManager.run(ClientModeConnectionManager.java:55) ~[spring-integration-ip-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) [spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_111]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_111]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_111]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_111]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]
如何停止此错误并关闭连接而不会出现任何异常和错误。
另外,以预期方式顺序处理(在运行时启动和停止)这些连接(集成流组件)而没有任何错误的有效方法是什么?
解决方案
你不应该停止工厂;它的生命周期由适配器控制;只需停止适配器;无需停止其他组件。
您也可以stop()
使用整个IntegrationFlow
bean ( out.flow
),它会停止组件。
推荐阅读
- javascript - YouTube 分析:无法解析内容
- jsf - p:panel facet "options" with p:menu - 无法设置与默认 "ui-icon-gear" 不同的图标
- listview - ListView 内的手势检测
- javascript - 如何在 Chrome DevTools 中打破 document.write?
- javascript - 使用单选按钮数组的文本框可见性
- python - 如何检查一个值是否在嵌套的 python 字典中?
- python - ImportError:在虚拟环境中导入熊猫时 Numpy
- python - 如何在不泄露代码的情况下将 Python 脚本加载到 Jupyter Notebook 并使其可用于所有单元格
- php - Heroku 上的 Laravel 强制执行 HTTP
- talend - 使用数据生成 Talend 序列