跳转至

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 校验)。
  • 响应结构Mapstatus/message/data,详见 index.md「响应结构与错误码 - 风格一」)。SSE 端点响应媒体类型为 text/event-streamPOST / 返回 void 无响应体

Notification 模型主要字段:idmessageIdsendersenderIdreceiverIdmodulemessageType(int)、summarylinkParamscreateTimedomainid

内部依赖 ConsumerService.registEmitter(emitter, userId) 将每个 SSE 连接按 userId 注册到内存表,由 MQ 消费侧(ConsumerService)推送增量通知。

源码注意DELETE /clearclearNotification)源码第 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 解析

请求示例

GET /api/message/notification/login?accessToken=<token> HTTP/1.1

响应

结构MapdataJSONObject(含消息计数/分类等聚合字段,具体由 NotificationProcess 决定);用户为 nulldata=null

成功示例

{
  "status": 1,
  "message": "ok",
  "data": { "total": 5, "unread": 3, "items": [ { "summary": "..." } ] }
}
失败示例
{ "status": 0, "message": "error" }


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 解析

请求示例

GET /api/message/notification/count/watch?accessToken=<token> HTTP/1.1
Accept: text/event-stream

响应

结构text/event-stream(SSE)。每条事件形如:

id:<timestampMillis>
data:<JSONObject 字符串>
心跳事件:
event:heat
id:<timestampMillis>
data:.

生命周期:连接断开/超时/出错时由 emitter.onCompletion/onTimeout/onError 调用 ConsumerService.unregisterEmitter(emitter) 注销并关闭调度线程池。

该端点未标注 @Operation


3. 获取消息中心通知(已废弃)

返回当前用户的消息中心通知。@Deprecated,建议改用 GET /login

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/api/message/notification(完整:{message-context}/api/message/notification
  • 鉴权:是
  • Tag:消息通知模块

请求参数

参数名 位置 类型 必填 说明
无显式参数;当前用户从 token 解析

请求示例

GET /api/message/notification?accessToken=<token> HTTP/1.1

响应

结构MapdataJSONObject(来自 NotificationProcess.sendMessageNotification2User);用户为 nulldata=null

成功示例

{ "status": 1, "message": "ok", "data": { "total": 5, "unread": 3 } }
失败示例
{ "status": 0, "message": "error" }


4. 清空消息中心通知

清空当前用户的消息中心通知(clearMessageNotification(null, null, null, userId))。

  • 接口类型:REST 资源
  • 请求方式DELETE
  • 请求路径/api/message/notification/clear(完整:{message-context}/api/message/notification/clear
  • 鉴权:是
  • Tag:消息通知模块

请求参数

参数名 位置 类型 必填 说明
无显式参数;当前用户从 token 解析

请求示例

DELETE /api/message/notification/clear?accessToken=<token> HTTP/1.1

响应

结构Mapdatanull(源码引用父类 datas 字段,默认 null,不写入 data)。

成功示例

{ "status": 1, "message": "ok" }
失败示例
{ "status": 0, "message": "error" }


5. 获得消息总数

返回当前用户的消息总数聚合(JSONObject)。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/api/message/notification/count(完整:{message-context}/api/message/notification/count
  • 鉴权:是
  • Tag:消息通知模块

请求参数

参数名 位置 类型 必填 说明
无显式参数;当前用户从 token 解析

请求示例

GET /api/message/notification/count?accessToken=<token> HTTP/1.1

响应

结构MapdataJSONObject(来自 NotificationProcess.getNotificationCount);用户为 nulldata=null

成功示例

{ "status": 1, "message": "ok", "data": { "total": 12, "unread": 4 } }
失败示例
{ "status": 0, "message": "error" }


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 解析

请求示例

GET /api/message/notification/count/listen?accessToken=<token> HTTP/1.1
Accept: text/event-stream

响应

结构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 吞掉。