NotificationController(消息中心通知 / SSE 推送)¶
cn.myapps.message.notification.controller.NotificationController(@Controller("NotificationAction"))— 消息中心通知的获取、清空、计数,以及基于 SseEmitter 的实时推送。继承 BaseController<Notification>,方法返回 Map<String, Object> 经 Jackson 序列化;SSE 端点返回 SseEmitter,不在 Map 风格之列。
- 基址:
${myapps.context-path.message:}/api/message/notification(完整:{message-context}/api/message/notification) - Tag:消息通知模块
- 鉴权:是(需 accessToken;详见 index.md「鉴权说明」)。SSE 端点的
accessToken仍需通过 query/Cookie/header 传递(受MessageSecurityFilter校验)。 - 响应结构:
Map(status/message/data,详见 index.md「响应结构与错误码 - 风格一」)。SSE 端点响应媒体类型为text/event-stream。POST /返回void无响应体。
Notification模型主要字段:id、messageId、sender、senderId、receiverId、module、messageType(int)、summary、linkParams、createTime、domainid。内部依赖
ConsumerService.registEmitter(emitter, userId)将每个 SSE 连接按userId注册到内存表,由 MQ 消费侧(ConsumerService)推送增量通知。源码注意:
DELETE /clear(clearNotification)源码第 172 行return addActionResult(true, datas)中的datas实为父类BaseController.datas字段(DataPackage<Notification>,默认null),因此成功响应中data字段不出现,等同addActionResult(true, null)。
1. 用户登录时获取消息通知¶
用户登录后调用,返回该用户当前累积的消息中心通知聚合数据(JSONObject,结构由 NotificationProcess.sendMessageNotificationWhenLogin 决定)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/api/message/notification/login(完整:{message-context}/api/message/notification/login) - 鉴权:是
- Tag:消息通知模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| — | — | — | — | 无显式参数;当前用户从 token 解析 |
请求示例¶
响应¶
结构:Map。
data:JSONObject(含消息计数/分类等聚合字段,具体由 NotificationProcess 决定);用户为 null 时 data=null。
成功示例:
{
"status": 1,
"message": "ok",
"data": { "total": 5, "unread": 3, "items": [ { "summary": "..." } ] }
}
2. 监听消息总数(持久 SSE 长连接)¶
通过 SseEmitter(超时时间设为 0L,即**永久连接**)向客户端推送消息总数。建立连接时即推送一次当前数据(来自 sendMessageNotificationWhenLogin),后续由 MQ 监听变化推送;同时每 30 秒发送一个事件名为 heat、数据为 . 的心跳包避免浏览器显示网络挂起。
- 接口类型:REST 资源(SSE 流)
- 请求方式:
GET - 请求路径:
/api/message/notification/count/watch(完整:{message-context}/api/message/notification/count/watch) - 鉴权:是
- Tag:消息通知模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| — | — | — | — | 无显式参数;当前用户从 token 解析 |
请求示例¶
响应¶
结构:text/event-stream(SSE)。每条事件形如:
生命周期:连接断开/超时/出错时由 emitter.onCompletion/onTimeout/onError 调用 ConsumerService.unregisterEmitter(emitter) 注销并关闭调度线程池。
该端点未标注
@Operation。
3. 获取消息中心通知(已废弃)¶
返回当前用户的消息中心通知。已 @Deprecated,建议改用 GET /login。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/api/message/notification(完整:{message-context}/api/message/notification) - 鉴权:是
- Tag:消息通知模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| — | — | — | — | 无显式参数;当前用户从 token 解析 |
请求示例¶
响应¶
结构:Map。
data:JSONObject(来自 NotificationProcess.sendMessageNotification2User);用户为 null 时 data=null。
成功示例:
失败示例:4. 清空消息中心通知¶
清空当前用户的消息中心通知(clearMessageNotification(null, null, null, userId))。
- 接口类型:REST 资源
- 请求方式:
DELETE - 请求路径:
/api/message/notification/clear(完整:{message-context}/api/message/notification/clear) - 鉴权:是
- Tag:消息通知模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| — | — | — | — | 无显式参数;当前用户从 token 解析 |
请求示例¶
响应¶
结构:Map。
data:null(源码引用父类 datas 字段,默认 null,不写入 data)。
成功示例:
失败示例:5. 获得消息总数¶
返回当前用户的消息总数聚合(JSONObject)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/api/message/notification/count(完整:{message-context}/api/message/notification/count) - 鉴权:是
- Tag:消息通知模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| — | — | — | — | 无显式参数;当前用户从 token 解析 |
请求示例¶
响应¶
结构:Map。
data:JSONObject(来自 NotificationProcess.getNotificationCount);用户为 null 时 data=null。
成功示例:
失败示例:6. 监听消息总数(限时 SSE 长连接)¶
通过 SseEmitter(超时时间 600_000L 毫秒 = 600 秒)向客户端推送消息总数。建立连接时推送一次当前数据(来自 getNotificationCount),后续由 MQ 监听变化推送。
- 接口类型:REST 资源(SSE 流)
- 请求方式:
GET - 请求路径:
/api/message/notification/count/listen(完整:{message-context}/api/message/notification/count/listen) - 鉴权:是
- Tag:消息通知模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| — | — | — | — | 无显式参数;当前用户从 token 解析 |
请求示例¶
响应¶
结构:text/event-stream(SSE)。首条事件 data 为 JSONObject,后续由 MQ 推送。
生命周期:连接断开/超时/出错时由 emitter.onCompletion/onTimeout/onError 调用 ConsumerService.unregisterEmitter(emitter) 注销。建连异常时 emitter.completeWithError(e) 并抛出 RuntimeException(HTTP 500)。
该端点未标注
@Operation。与GET /count/watch的差异:本端点超时 600 秒、无心跳包;/count/watch超时永久且每 30 秒心跳。
7. 创建通知¶
创建一条消息中心通知。返回 void,无响应体;服务端异常时打印堆栈但不抛出(HTTP 200,无响应体)。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/api/message/notification(完整:{message-context}/api/message/notification) - 鉴权:是
- Tag:消息通知模块
请求体¶
请求体为 Notification JSON(@RequestBody Notification):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| messageId | string | 否 | 关联消息 id |
| receiverId | string | 否 | 接收人 id |
| senderId | string | 否 | 发送人 id |
| messageType | int | 否 | 消息类型 |
| summary | string | 否 | 摘要 |
| linkParams | string | 否 | 跳转参数(JSON 字符串) |
| module | string | 否 | 来源模块 |
请求示例¶
POST /api/message/notification?accessToken=<token> HTTP/1.1
Content-Type: application/json
{ "messageId": "<mid>", "receiverId": "<uid>", "messageType": 1, "summary": "新消息", "linkParams": "{}" }
响应¶
结构:无(void,HTTP 200,无响应体)。源码在控制台打印 Notice--><对象>,业务异常被 try/catch 吞掉。