websocket - Micronaut - 将 WebSocketSession 持久化到 redis
问题描述
我试图在 Redis 上保留我的 WebsocketSessions,然后成功地将消息广播到我所有的活动会话。遵循文档:
- https://docs.micronaut.io/latest/guide/index.html#websocket
- https://docs.micronaut.io/latest/guide/index.html#sessions
- https://micronaut-projects.github.io/micronaut-redis/latest/guide/#sessions
我希望当我有以下代码时ServerWebSocket
,WebSocket 会话会自动存储在 Redis 上。
@OnOpen
fun onOpen(branchId: Long, session: WebSocketSession) {
session.put(USER_SESSION_KEY, user.id)
session.put(BRANCH_SESSION_KEY, branch.id)
...
session.sendAsync("smth")
}
然后每当我打电话给广播者时,我都希望将消息广播到与给定谓词匹配的所有打开的存储redis会话。
webSocketBroadcaster.broadcastAsync(
webSocketMessage,
shouldSendMessageForSession(order)
)
private fun shouldSendMessageForSession(order: OrdersEntity) = Predicate<WebSocketSession> { session ->
val userId = session[USER_SESSION_KEY, Long::class.java].toNullable() ?: return@Predicate false
val user = userEntityRepository.findById(userId).toNullable() ?: return@Predicate false
val branchId = session[BRANCH_SESSION_KEY, Long::class.java].toNullable() ?: return@Predicate false
return@Predicate order.branchId == branchId && order.canAccessWithUser(user)
}
可悲的是,这没有发生,或者我遗漏了一些东西:(有没有人找到解决方案?
- 这支持吗?
- 如果是的话,我的广播员,我是否需要做其他事情才能了解存储在 Redis 上的所有会话?
- 有没有办法序列化|持久化 webSocketSession?
谢谢!
解决方案
推荐阅读
- javascript - 密码必须包含以下任一条件
- python - 如何检查节点列表是否已包含在列表列表中的列表中?
- c - 如何在C中以概率随机生成0和1生成mxn矩阵
- arrays - Google Analytics 返回行名而不是数字索引
- javascript - 带有 ng-packagr 的 Angular 4 组件库
- laravel - 117/5000 上传文件到 cpanel 中的 public_html
- c# - Entity Framework Core 如何先实现代码?
- android - com.google.firebase:firebase-database:16.0.1 问题
- python - 无法加载张量流
- android - 单选按钮仅在 android studio 中被选中