场景
我的项目须要在私聊中来实现一个阅后即焚的性能,即 A 用户给 B 用户发送音讯,B 用户在进入聊天页面查看之后 A 用户删除此音讯,B 用户开始进入倒计时,倒计时完结后,删除此音讯。
思考
-
大体的梳理一下具体的逻辑
- A -> B
- B 进入会话页面
- B 将此音讯开始倒计时
- 告诉 A 我已进行浏览
- A 删除音讯
-
从下面内容咱们来大体的设计一下咱们须要用户的技术
- 单例类
- 自定义音讯,用来通知 A 我曾经开始浏览了,你删除吧
- 一个用于保护阅后即焚音讯的治理类
- 一个存储 A 给 B 发送的所有的阅后即焚的音讯的容器 A <k, v> k 为 targetid ,v 为 messageIDs
- 一个存储每条阅后即焚音讯的容器 B <k,v> k 为 messageId, v 为以后音讯还剩的倒计时工夫。
- 一个用来存储所有阅后即焚音讯的容器 C K:ID V:msg
- 两个解决队列 一个解决工夫 一个解决音讯
-
对外裸露接口
- 代理 接管方焚烧音讯的每秒倒计时
- 告诉 接管方收到对方已浏览某条音讯的告诉
详解
- 初始化咱们的所有容器
- 收到音讯,在适合的业务机会将此音讯退出到焚烧队列
- 查问音讯是否曾经在焚烧队列
- 如果不在,增加到 A B C 容器
- 执行倒计时
倒计时操作
- 遍历 C 是否有音讯
- 给发送方发送音讯,告诉我曾经开始焚烧 A 里的音讯了 并在 A 容器删除此会话
- 发送方收到音讯发送告诉
- 接管方遍历 B 容器,判断每条音讯是否到时
- 如果音讯焚烧工夫到 在 A、B 容器删除,并触发代理
- 如果没到工夫,就触发代理并批改 此音讯在 B 容器的时长。