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
。