import jakarta.websocket.OnClose;
时间: 2025-03-22 11:04:45 浏览: 28
### Jakarta WebSocket `@OnClose` 注解的用途与细节
Jakarta WebSocket 是一种用于实现 WebSocket 协议的标准 Java API。其中,`@OnClose` 是一个重要的注解,通常被用来标记方法以便在 WebSocket 连接关闭时执行特定逻辑。
当客户端断开连接或者服务器主动关闭连接时,标注有 `@OnClose` 的方法会被触发。该方法可以接收一个参数类型为 `Session` 和/或 `CloseReason`,这使得开发者能够获取关于会话以及关闭原因的信息[^2]。
#### 方法签名的要求
- 被 `@OnClose` 标记的方法必须是非静态的。
- 它可以选择性地接受两个参数:一个是 `javax.websocket.Session` 或者其子类实例;另一个是 `javax.websocket.CloseReason` 实例。
以下是典型的 `@OnClose` 方法定义:
```java
import jakarta.websocket.OnClose;
import jakarta.websocket.Session;
import jakarta.websocket.CloseReason;
public class MyWebSocket {
@OnClose
public void onClose(Session session, CloseReason closeReason) {
System.out.println("Connection closed for session: " + session.getId());
System.out.println("Close reason: " + closeReason.getReasonPhrase());
}
}
```
在这个例子中,每当某个客户端断开了 WebSocket 连接,都会调用上述 `onClose` 方法并打印出对应的会话 ID 及关闭的原因描述。
#### 关于 `CloseReason`
`CloseReason` 类提供了有关为什么 WebSocket 连接终止的具体信息。它包含了标准的状态码和可读的消息字符串。状态码遵循 RFC 6455 中规定的数值范围,例如正常关闭对应的是 `1000` (即 `CloseCodes.NORMAL_CLOSURE`)。
如果需要自定义关闭行为,则可以在发送关闭信号的时候指定这些值。比如通过调用 `session.close(new CloseReason(CloseReason.CloseCodes.GOING_AWAY, "Server is shutting down"))`.
#### 注意事项
虽然 Spring Framework 支持 WebSocket 并允许配置 handlers 来管理消息流[^1],但它并不直接支持 Jakarta WebSocket annotations 如 `@OnClose`. 如果计划在一个基于 Spring 的项目里利用此类功能,可能需要考虑引入额外的支持库或者是切换到纯 Jakarta EE 环境下开发应用。
---
阅读全文
相关推荐











