TCP 连接事件
从 3.0 版本开始,TcpConnection
实例的更改由 TcpConnectionEvent
实例报告。TcpConnectionEvent
是 ApplicationEvent
的子类,因此可以被在 ApplicationContext
中定义的任何 ApplicationListener
或 @EventListener
方法接收。另请参阅事件入境通道适配器。
TcpConnectionEvents
具有以下属性:
-
connectionId
: 连接标识符,你可以在消息头中使用它将数据发送到连接。 -
connectionFactoryName
: 连接所属的连接工厂的bean名称。 -
throwable
:Throwable
(仅用于TcpConnectionExceptionEvent
事件)。 -
source
:TcpConnection
。例如,你可以使用它来确定远程 IP 地址,使用getHostAddress()
(需要类型转换)。
可用的 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
。