实时通知用户
需求:
用户订单秒杀成功之后,对用户进行秒杀成功通知。
弹出个提示框来提示。
代码:
前端:
后端:
因为前端多携带了一个uuid作为标识,现在需要修改下涉及到的参数
这个类是来消费MQ里面的消息的,得到消息后进行秒杀操作。
现在在秒杀操作之后,再往MQ发送一个消息,让websocket来监听这个消息,然后通知用户是否秒杀成功。
后面发现这个发送同步消息没有放到try里面去,得注意,不然下单失败还能发送延迟消息
WebSocket
创建 websocket-server 服务
添加依赖:
配置 yml 和 启动类:
前端:
这里就在用户点击秒杀后,把消息发送到MQ,然后这边提示在抢购中,然后创建一个websocket连接。
后端代码:
开启websocket支持的配置类
一些http协议服务,这个类具体作用后面可以百度
消费消息用到的常量
这个是消费类,消费MQ里面的消息的
通过注解上的那些标签和topic辨别出这个类要消费MQ里面的哪条消息,然后把消息里面的结果通过websocket发送给客户端
注意:
测试:
这里睡眠2秒的目的。
测试后一切正常,符合期望,websocket使用成功。
总结:
websocket里面也是写了一个类来消费MQ的消息,消费到消息之后,把消息返回给客户端。
返回给客户端的方式:通过配置websocket配置类和server类,然后在消费类这里根据主题、标签等标识获取到对应的消息之后,根据uuid获取到对应的客户端,把秒杀的数据返回给客户端
让用户登录时产生一个uuid,在点击秒杀时把uuid携带上,把秒杀数据发送到MQ中,消息就包含有uuid。
详细总结:
1、用户登录的时候,就写一个生成uuid的方法
2、用户点击秒杀的时候,把uuid作为参数传递过去。
3、点击秒杀后,把秒杀的数据(用户id,商品的秒杀id,uuid)发送到MQ消息队列里面。
4、写一个消费MQ消息的消费类,实现RocketMQListener类,重写onMessage方法(这个onMessage在启动服务后就会自动执行,去MQ里面找对应的消息进行消费)
5、消费类根据对应的主题、标签tag、topic找到MQ里面对应的消息,在onMessage方法里面把数据拿出来,然后去调用doSeckill秒杀方法,执行秒杀操作。
6、执行秒杀操作后下一行代码,再向MQ发送一条秒杀结果的消息
7、创建一个websocket-server服务,配置到websocket需要的配置类和server类,然后写一个消费MQ消息的消费类。去消费第6点说的秒杀结果的消息。
8、获取到秒杀结果的消息后,再通过传来的消息里面的uuid,通过websocket的方法获取到对应的客户端,然后把秒杀结果发送过去,发给客户端。
以后看可能不会很清晰,需要结合上面的笔记。
一个消息G放在MQ中,这时候有多个消费者(A消费者和B消费者),属于不同的消费组,只要这些消费者(A、B)的主题topic、标签tag和消息G的主题topic、标签tag对应上,都可以消费这个消息G。