首页 > 其他分享 >oa项目-系统通知实现

oa项目-系统通知实现

时间:2022-11-21 22:45:50浏览次数:45  
标签:异步 队列 通知 轮询 系统 oa 查询 线程 消息

1,采用的是mongdB存储,普通的mysql难以支撑

2,mongdB搞冷热分离,但是考虑到大型web项目也难以支撑一条公告发送百万数据,采用消息队列细睡长流慢慢的写入mongdb

3,使用异步线程的方式往消息队列发送消息

4,系统的消息存储的消息队里上,只是用他过渡,消息最终还是存储到数据上,这样就可以用户登录的时候异步从队列取出消息,然后存储到数据库,最后在把队列删除。

业务:

系统登录:

用户登录的时候可以异步从队列收取消息

轮询接受消息:

系统5分钟轮询查询一次消息,异步从队列中获取消息,把lastFlag设置为true代表新接受的消息,当查询数据库中有多少条消息的把lastFlag改成false,修改了多少就代表新接受了多少消息。

修改用户资料:

修改过后,修改通知消息从队列取出,首页轮询查询出系统提示

 

什么时候使用异步和同步?

只要跟前端没关系的消息收发,用异步的都可以,比如系统之间的消息收发,用异步就很恰当。但是跟前端有关,因为HTTP协议是短连接,所以这次刷新页面就应该明确知道接收了多少条消息。如果用异步,HTTP连接都断开了,后端才刷到消息,怎么能推送给前端页面?所以必须要用同步的。消息没收完,就别切断HTTP连接。

总结:因为http是短链接,如果使用异步的话,还等等待接受消息,消息没有收取完成就会切断。

项目中使用的异步线程,同步mq

这里有两种异步方式:MQ的异步和线程执行的异步。MQ的异步更像是挂载后台阻塞运行,没收到消息也不退出,一直在后端运行。这种方式肯定不妥,所以我们选择的是MQ同步执行,收完消息就退出。线程池方面,我们选择的是异步线程执行MQ的同步接收消息。如果用MQ的异步方式,一直阻塞下去,线程池的线程永远不放回到线程池,线程池很快就被耗光

总结:

这里简单的总结就是使用异步线程池,去执行mq同步接受的消息,这样执行完之后就会放回去,不会导致线程池的线程耗光。

RabbitMQ的API分成阻塞和非阻塞

 

Message集合uuid设计

比如5分钟来了一堆消息。其中一个消息没有在这5分钟消费者还有没有消费,但是又来了一个轮询会接受两个一样的消息所以使用uuid来辨别重复。

 

 

 

业务实现:

分页查询查询显示,这个使用连表查询,显示到页面。这里主要Aggregation构建集合连接。调用mongoTemplate.aggregate(),查询出连接的所有消息,之后遍历每一个消息,拼接map中显示页面。

根据id查询:

mongoTemplate.findById()

根据id查询,在修改:

mongoTemplate.updateFirst()

根据id删除:

mongoTemplate.remove

保存

 mongoTemplate.save

刷新用户的消息: 比如用户登录的时候发送了一条系统通知,保存到了mongdb对象中,调用mq收取消息保存到mongdb中,发送消息主体,附属message集合主键,发送消息。

轮询的时候异步线程线程,同步mq收取mq队列中的消息,获取队列中的消息的时候,收取的时候保存到message_ref集合中,并把收取消息改为true,此时也在同时进行查询数量就是把true改为false,最后返回查询的数量。

 

总结:

  1. 发送通知到mq队列

  2. 定时轮询接受消息,并查询新接受消息的数量(根据lastFlag属性标记来查询数量)

  3. 其他都是一些增删改查

标签:异步,队列,通知,轮询,系统,oa,查询,线程,消息
From: https://www.cnblogs.com/mrwyk/p/16913661.html

相关文章

  • 嵌入式可配置实时操作系统eCos
    ​​​​eCos是为嵌入式应用设计的无版税开放源代码的实时操作系统。eCos的高度可配置性,允许对操作系统进行定制,以精确地匹配应用需求,提供最佳运行时性能和最少硬件资源占用......
  • 业务系统的稳定性建设
    在当下微服务、分布式架构的背景下,一次简单的接口调用背后可能涉及到了多个业务服务单元和服务器。如何才能在当前架构下准确、高效、即时地了解业务系统的运行情况、保......
  • C/C++校运动会成绩管理系统
    C/C++校运动会成绩管理系统该系统可以记录校运动会全部运动项目的成绩、得分和排名情况,系统功能项以菜单形式显示。项目包括50米、100米、200米、400米、1500米、各接力项......
  • 17.多线程并发在电商系统下的追本溯源(4)
           ......
  • C/C++仓库管理系统
    C/C++仓库管理系统四、仓库管理系统问题描述:1.问题描述:已知一工厂有5个仓库(仓库编号、仓库规格),用于保存公司生产的10类产品(产品编号、产品名称、产品规格),任何--......
  • 16.多线程并发在电商系统下的追本溯源(3)
      用读写锁可以优化此处代码                                           ......
  • 黑马程序员 学生管理系统中的一些数据验证知识点
    用户名长度必须在3-15位之间,只能是字母加数字的组合,但不能是纯数字publicstaticbooleancheckUsername(Stringusername){intlength=username.length();i......
  • 超市积分管理系统
    超市积分管理系统链接:https://pan.baidu.com/s/143X1AEynKvs0vlDT6uNdfg?pwd=0011提取码:0011超市会员积分管理系统主要用于实现了企业管理数据统计等。本系统结构如下:(1)......
  • 基于Swing+Java的影院购票系统,GUI界面
    基于Swing+Java的影院购票系统基于Swing+Java的电影院院购票系统基于Swing+Java的影院售票管理系统基于Swing+Java的电影院管理系统系统功能截图1.登录2.忘记密码......
  • [题解] CF1149D Abandoning Roads
    难得自己想出来一道3000分的题,虽然说考试的时候打挂了...首先先对较小的边缩点,然后求连通块内的最短路。显然,连通块内其实想怎么走就怎么走,但不能走较大的边。然后不同......