我们在项目里的websocket应用比较多,比如后台管理系统的通知,还有的话就是一些直播场景(互动聊天)需要用到websocket通信,我们一般是通过ajax读取后台数据让页面变成动态的,他无法实现后台主动推送数据给前台,websocket可以,他是把http短链接改成长链接,能实现前后台双向通信,当这个用户登陆成功然后初始化页面的时候会建立websocket链接,后台可以给前台推送消息了;
前后台对应的方法:onOpen建立链接,onClose关闭链接,onMessage发送消息,onError报错异常,我们在open方法用到了ConcurrentHashMap来保存客户端实例,当发送消息的时候我们拿到这个ConcurrentHashMap找到对应的用户调用这个当前实例的message方法给前端推送消息
消防报警:硬件在发生烟感设备报警的话,我们的MQ会接收到这个消息,消息类型就是火警,会调用websocket发送消息方法,然后让前端有警报,系统也会做相应的通知,由消防人员确认真实性,执行相应的处理措施
分布式定时任务xxl-job
实现方式常用的有Quartz,xxl-job,spring task,我们项目都有应用过,一般有一个后台管理界面来管理定时任务,对定时任务进行增删改查,定时任务主要是有这种调度器,执行器,触发器(cron)组成的,我们项目里用xxl-job比较多,分为调度器和执行器,调度中心是一个单独的服务,可以启动多个实例来实现高可用,然后他管理任务(任务的名称,调度算法可以选择轮训,选择第一个或者是最后一个)还有执行器,是嵌入在微服务里边,当微服务启动的时候他会把自己注册到注册中心去,当有任务触发的时候就会调这个执行器,xxl-job的好处是调度中心和执行器分离,减少了定时任务和具体的微服务之间的耦合。
rabbitMQ的延迟队列(死信队列)
两种方式实现:一种是装插件的方式(聚合支付里边其实是用的插件)还有一种是利用mq的队列queue过期来实现,我们发送消息时的时候是把消息发送给交换机,交换机路由到队列,然后由消费者去消费的,如果一个队列没有消费者,他就是一个死信队列,如果队列设置了过期时间,过期的话就会从队列里删除,如果同时设置了交换机的名称还有路由key,就会转发到正式队列里面,然后被消费。