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。