TCP 连接事件
从 3.0 版本开始,TcpConnection
实例的变更由 TcpConnectionEvent
实例报告。TcpConnectionEvent
是 ApplicationEvent
的子类,因此可以被在 ApplicationContext
中定义的任何 ApplicationListener
或通过 @EventListener
方法接收。另请参阅一个事件入站通道适配器。
TcpConnectionEvents
具有以下属性
-
connectionId
: 连接标识符,您可以在消息头中使用它向连接发送数据。 -
connectionFactoryName
: 连接所属的连接工厂的 bean 名称。 -
throwable
:Throwable
异常(仅适用于TcpConnectionExceptionEvent
事件)。 -
source
:TcpConnection
。例如,您可以使用它通过getHostAddress()
获取远程 IP 地址(需要类型转换)。
可用的 TcpConnectionEvent
,与特定连接相关的包括
-
TcpConnectionOpenEvent
-
TcpConnectionCloseEvent
-
TcpConnectionExceptionEvent
此外,从 4.0 版本开始,TCP 连接工厂 中讨论的标准反序列化器在解码数据流时遇到问题时,会发出 TcpDeserializationExceptionEvent
实例。这些事件包含异常、正在构建的缓冲区以及异常发生时缓冲区中的偏移量(如果可用)。应用程序可以使用普通的 ApplicationListener
、@EventListener
方法或 ApplicationEventListeningMessageProducer
(参阅接收 Spring 应用程序事件)来捕获这些事件,从而分析问题。
从 4.0.7 和 4.1.3 版本开始,只要服务器套接字上发生意外异常(例如服务器套接字正在使用时的 BindException
),就会发布 TcpConnectionServerExceptionEvent
实例。这些事件包含连接工厂的引用和异常原因。
从 4.2 版本开始,当端点(入站网关或协作的出站通道适配器)接收到由于 ip_connectionId
头部无效而无法路由到连接的消息时,就会发布 TcpConnectionFailedCorrelationEvent
实例。出站网关在收到延迟回复(发送线程已超时)时也会发布此事件。该事件包含连接 ID 以及 cause
属性中的异常,该属性包含失败的消息。
从 4.3 版本开始,当服务器连接工厂启动时,会发出 TcpConnectionServerListeningEvent
。当工厂配置为监听端口 0
(意味着操作系统选择端口)时,这非常有用。如果需要在启动连接到套接字的其他进程之前等待,也可以使用它代替轮询 isListening()
。
为了避免延迟监听线程接受连接,事件会在单独的线程上发布。 |
从 4.3.2 版本开始,只要无法创建客户端连接,就会发出 TcpConnectionFailedEvent
。事件的源是连接工厂,您可以使用它来确定无法建立连接的主机和端口。
要使用单个 ApplicationListener
(或 @EventListener
方法)来接收所有这些事件(包括 TcpConnectionEvent
),请将监听器配置为接收 IpIntegrationEvent
。