第二十七章 新版消息队列RabbitMQ回顾和容器化安装部署
第1集 基于Linux服务器安装RabbitMQ容器化部署
简介:Docker安装RabbitMQ消息队列
- 阿里云安装RabbitMQ
- 最少 2核4g或者推荐 2核8g(用家人账号购买,接近1折,初次买1年或者3年)
- 登录个人的Linux服务器
- ssh root@8.129.113.233
- Docker安装RabbitMQ
- 地址:https://hub.docker.com/_/rabbitmq/
#拉取镜像
docker pull rabbitmq:3.8.12-management-alpine
docker run -d --hostname rabbit_host1 --name xd_rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:3.8.12-management-alpine
#介绍
-d 以守护进程方式在后台运行
-p 15672:15672 management 界面管理访问端口
-p 5672:5672 amqp 访问端口
--name:指定容器名
--hostname:设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts,作为容器主机IP的别名,并且将显示在容器的bash中
-e 参数
RABBITMQ_DEFAULT_USER 用户名
RABBITMQ_DEFAULT_PASS 密码
- 主要端口介绍
4369 erlang 发现口
5672 client 端通信口
15672 管理界面 ui 端口
25672 server 间内部通信口
访问管理界面
- ip:15672
注意事项!!!!
- Linux服务器检查防火墙是否关闭
- 云服务器检查网络安全组是否开放端口
CentOS 7 以上默认使用的是firewall作为防火墙
查看防火墙状态
firewall-cmd --state
停止firewall
systemctl stop firewalld.service
禁止firewall开机启动
systemctl disable firewalld.service
第2集 延迟队列核心知识之RabbitMQ死信队列 TTL回顾
简介:讲解RabbitMQ的的死信队列 TTL
- 什么是TTL
- time to live 消息存活时间
- 如果消息在存活时间内未被消费,则会别清除
- RabbitMQ支持两种ttl设置
- 单独消息进行配置ttl
- 整个队列进行配置ttl(居多)
- 什么是rabbitmq的死信队列
- 没有被及时消费的消息存放的队列
- 什么是rabbitmq的死信交换机
- Dead Letter Exchange(死信交换机,缩写:DLX)当消息成为死信后,会被重新发送到另一个交换机,这个交换机就是DLX死信交换机。
- 消息有哪几种情况成为死信
- 消费者拒收消息**(basic.reject/ basic.nack)**,并且没有重新入队 requeue=false
- 消息在队列中未被消费,且超过队列或者消息本身的过期时间TTL(time-to-live)
- 队列的消息长度达到极限
- 结果:消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列
第3集 RabbitMQ 延迟队列介绍和应用场景回顾
简介:讲解RabbitMQ的延迟队列和应用场景
- 什么是延迟队列
- 一种带有延迟功能的消息队列,Producer 将消息发送到消息队列 服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到 Consumer 进行消费,该消息即定时消息
- 使用场景
- 通过消息触发一些定时任务,比如在某一固定时间点向用户发送提醒消息
- 用户登录之后5分钟给用户做分类推送、用户多少天未登录给用户做召回推送;
- 消息生产和消费有时间窗口要求:比如在天猫电商交易中超时未支付关闭订单的场景,在订单创建时会发送一条 延时消息。这条消息将会在 30 分钟以后投递给消费者,消费者收到此消息后需要判断对应的订单是否已完成支付。 如支付未完成,则关闭订单。如已完成支付则忽略
- Cloud微服务大课训练营里面的应用
- 优惠券回收
- 商品库存回收
- 业界的一些实现方式
- 定时任务高精度轮训
- 采用RocketMQ自带延迟消息功能
- RabbitMQ本身是不支持延迟队列的,怎么办?
- 结合死信队列的特性,就可以做到延迟消息
- 操作
- 消息生产
- 投递到普通的topic交换机
- 消息过期,进入死信交换机
- 消息消费
- 消费者监听死信交换机的队列
- 消息生产
第4集 SpringCloudAlibaba微服务整合RabbitMQ依赖和配置
简介:项目整合RabbitMQ依赖和配置
- 什么是Spring-AMQP
- 官网:https://spring.io/projects/spring-amqp
- Spring 框架的AMQP消息解决方案,提供模板化的发送和接收消息的抽象层,提供基于消息驱动的 POJO的消息监听等
- 提供不依赖于任何特定的AMQP代理实现或客户端库通用的抽象,最终用户代码将很容易实现更易替换、添加和删除AMQP,因为它可以只针对抽象层来开发
- 总之就是提高我们的框架整合消息队列的效率,SpringBoot为更方便开发RabbitMQ推出了starter,
- 我们使用 spring-boot-starter-amqp 进行开发
- common项目添加依赖
<!--引入AMQP-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
- 各个微服务添加配置
#消息队列
rabbitmq:
host: 8.129.113.233
port: 5672
virtual-host: /
password: password
username: admin
#开启手动确认消息
listener:
simple:
acknowledge-mode: manual
- 其他自定义配置后续添加
第二十八章 下单-优惠券记录锁定和释放功能设计开发
第1集 商品下单锁定优惠券记录模块开发
简介:商品下单锁定优惠券记录模块开发
- 协议设计
/**
* 记录id
*/
private List<Long> lockCouponRecordIds;
/**
* 订单号
*/
private String orderOutTradeNo;
- controlle层接口开发
- service层开发
第2集 优惠券微服务RabbitMQ延迟消息交换机和队列配置
简介:优惠券微服务RabbitMQ延迟消息交换机和队列配置
- 配置文件
#自定义消息队列配置,发送锁定库存消息-》延迟exchange-》lock.queue-》死信exchange-》release.queue
mqconfig:
#延迟队列,不能被监听消费
coupon_release_delay_queue: coupon.release.delay.queue
#延迟队列的消息过期后转发的队列
coupon_release_queue: coupon.release.queue
#交换机
coupon_event_exchange: coupon.event.exchange
#进入延迟队列的路由key
coupon_release_delay_routing_key: coupon.release.delay.routing.key
#消息过期,进入释放死信队列的key
coupon_release_routing_key: coupon.release.routing.key
#消息过期时间,毫秒,测试改为15秒
ttl: 15000
- 配置类
/**
* 交换机
*/
@Value("${mqconfig.coupon_event_exchange}")
private String eventExchange;
/**
* 第一个队列延迟队列,
*/
@Value("${mqconfig.coupon_release_delay_queue}")
private String couponReleaseDelayQueue;
/**
* 第一个队列的路由key
* 进入队列的路由key
*/
@Value("${mqconfig.coupon_release_delay_routing_key}")
private String couponReleaseDelayRoutingKey;
/**
* 第二个队列,被监听恢复库存的队列
*/
@Value("${mqconfig.coupon_release_queue}")
private String couponReleaseQueue;
/**
* 第二个队列的路由key
*
* 即进入死信队列的路由key
*/
@Value("${mqconfig.coupon_release_routing_key}")
private String couponReleaseRoutingKey;
/**
* 过期时间
*/
@Value("${mqconfig.ttl}")
private Integer ttl;
第3集 延迟消息功能测试开发和注意事项
简介:延迟消息测试和注意事项
- 测试代码编写测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = CouponApplication.class)
@Slf4j
public class DemoApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void send(){
rabbitTemplate.convertAndSend("coupon.event.exchange","coupon.release.delay.routing.key","5qeqweqw");
}
}
- 注意
- 有些版本会自动创建队列和交换机@bean,有些是要初次请求才会(如果有同学知道原因可以分享下)
- 如果MQ已经存在对应的队列,则不会重新创建
- 修改配置后,需要删除队列重新建立生效
- 如果队列和交换机已经存在,重新启动项目会有错误警告,可以忽略
第4集 优惠券锁定-发送延迟消息功能开发
简介:优惠券微服务发送延迟消息开发
- 消息协议介绍
@Data
public class CouponRecordMessage {
/**
* 消息队列id
*/
private Long messageId;
/**
* 订单号
*/
private String outTradeNo;
/**
* 库存锁定工作单id
*/
private Long taskId;
}
- 发送功能开发
for(CouponTaskDO couponTaskDO : couponTaskDOList){
CouponRecordMessage couponRecordMessage = new CouponRecordMessage();
couponRecordMessage.setOutTradeNo(orderOutTradeNo);
couponRecordMessage.setTaskId(couponTaskDO.getId());
rabbitTemplate.convertAndSend(rabbitMQConfig.getEventExchange(),rabbitMQConfig.getCouponReleaseDelayRoutingKey(),couponRecordMessage);
log.info("优惠券锁定消息发送成功:{}",couponRecordMessage.toString());
}
第5集 优惠券微服务延迟消息消费-释放优惠券功能开发《上》
简介:优惠券回收-延迟消息消费回收功能开发《上》
- 优惠券消费MQ监听器开发
- 流程梳理
优惠券解锁记录场景
1、超时未支付,比如30分钟则订单失效关闭
2、下单成功,创建订单业务失败,订单回滚
库存解锁防止继续支付:
1、30分支付超时则无法支付订单
2、订单31分延迟消息(比订单超时大几分钟)
->查询订单状态-向第三方支付查询订单状态,只有未支付状态,且本地订单状态是NEW,才修改本地订单状态为取消CANCEL,其他业务才可以解锁对应的库存库存
3、商品、优惠券库存32分延迟消息(比订单超时大几分钟)
->查询订单状态-订单不存在,解锁库存
->查询订单状态
1)订单状态为取消CANCEL的情况,才可以解锁库存,确认消息接收;
2)订单状态为未支付NEW的情况,则不解锁库存,不修改订单状态,重新投递消息或者拒收;
(避免网络延迟到 导致订单关单消息,比库存解锁还慢,没更新订单状态)
3)如果是订单已经支付则修改库存task工作单状态,确认消息接收;
注意:延迟队列一定要开启手动的ack机制,防止解锁失败,消息丢失,也要防止多次解锁
解锁库存的时候:修改状态和修改对应库存task工作单状态应该是同个事务,防止其中一个失败
第6集 订单微服务-查询订单支付状态接口开发
简介:订单微服务-查询订单支付状态接口开发
- 查询订单支付状态接口开发(MQ里面没token,不需要登录)
第7集 数据一致性多场景用例测试-延迟消息消费释放优惠券功能开发《下》
简介:优惠券回收-延迟消息消费回收功能开发《下》
- 流程测试
- 写单元测试,发送消息
- 订单支付完成用例测试
- 订单超时未支付用例测试
- 订单异常不存在用例测试
- 消息延迟,监听消息处理
- 记录更新情况
- bug修复:useState变量名称
- 写单元测试,发送消息
- 数据准备
INSERT INTO `product_order` (`id`, `out_trade_no`, `state`, `create_time`, `total_amount`, `pay_amount`, `pay_type`, `nickname`, `head_img`, `user_id`, `del`, `update_time`, `order_type`, `receiver_address`)
VALUES
(1, '123456abc', 'PAY', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL);
INSERT INTO `coupon_task` (`id`, `coupon_record_id`, `create_time`, `out_trade_no`, `lock_state`)
VALUES
(1, 1, '2021-02-27 16:05:11', '123456abc', 'LOCK');
- 功能流程完善
- 业务逻辑优化
- 如何保证消息不会重复消费-幂等处理
- 多个消息并发情况下是否需要加锁
- 是否还有其他问题,大家可以思考下,然后给出解决方案
愿景:“让编程不再难学,让技术与生活更加有趣”
第二十九章 高并发下商品库存扣减和释放解决方案设计和编码
第1集 商品下单-商品库存锁定模块设计和开发
简介:商品下单-锁定商品库存模块开发
- 协议设计
@Data
public class LockProductRequest {
@JsonProperty("order_out_trade_no")
private String orderOutTradeNo;
@JsonProperty("order_item_list")
private List<OrderItemRequest> orderItemList;
}
@Data
public class OrderItemRequest{
@JsonProperty("product_id")
private long productId;
@JsonProperty("buy_num")
private int buyNum;
}
- controlle层接口开发
- service层开发
- 登录拦截器配置
第2集 商品微服务RabbitMQ延迟消息交换机和队列配置
简介:商品微服务RabbitMQ延迟消息交换机和队列配置
- 配置文件
#自定义消息队列配置,发送锁定库存消息-》延迟exchange-》lock.queue-》死信exchange-》release.queue
mqconfig:
#延迟队列,不能被监听消费
stock_release_delay_queue: stock.release.delay.queue
#延迟队列的消息过期后转发的队列
stock_release_queue: stock.release.queue
#交换机
stock_event_exchange: stock.event.exchange
#进入延迟队列的路由key
stock_release_delay_routing_key: stock.release.delay.routing.key
#消息过期,进入释放队列的key
stock_release_routing_key: stock.release.routing.key
#消息过期时间,毫秒,测试改为15秒
ttl: 15000
- 配置类
/**
* 交换机
*/
@Value("${mqconfig.stock_event_exchange}")
private String eventExchange;
/**
* 第一个队列延迟队列,
*/
@Value("${mqconfig.stock_release_delay_queue}")
private String stockReleaseDelayQueue;
/**
* 第一个队列的路由key
* 进入队列的路由key
*/
@Value("${mqconfig.stock_release_delay_routing_key}")
private String stockReleaseDelayRoutingKey;
/**
* 第二个队列,被监听恢复库存的队列
*/
@Value("${mqconfig.stock_release_queue}")
private String stockReleaseQueue;
/**
* 第二个队列的路由key
*
* 即进入死信队列的路由key
*/
@Value("${mqconfig.stock_release_routing_key}")
private String stockReleaseRoutingKey;
/**
* 过期时间
*/
@Value("${mqconfig.ttl}")
private Integer ttl;
第3集 商品锁定-延迟消息功能测试开发和注意事项
简介:延迟消息测试和注意事项
- 测试代码编写测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ProductApplication.class)
@Slf4j
public class DemoApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void send(){
rabbitTemplate.convertAndSend("stock.event.exchange","stock.release.delay.routing.key","23342342");
}
}
- 注意
- 只有微服务监听mq,才会创建对应的队列和交换机,所以编写测试方法或者写监听器就行
- IOC容器存在不行,RabbitMQ默认是懒加载模式
- 如果MQ已经存在对应的队列,则不会重新创建
- 修改配置后,需要删除队列重新建立生效
- 如果队列和交换机已经存在,重新启动项目会有错误警告,可以忽略
第4集 商品库存锁定-发送延迟消息功能开发
简介:商品微服务发送延迟消息开发
- 消息协议介绍
@Data
public class ProductMessage {
/**
* 消息队列id
*/
private Long messageId;
/**
* 订单号
*/
private String outTradeNo;
/**
* 库存锁定工作单id
*/
private Long taskId;
}
- 发送功能开发
//发送MQ延迟消息 ,解锁商品库存 taskId TODO
ProductMessage productMessage = new ProductMessage();
productMessage.setTaskId(productTaskDO.getId());
productMessage.setOutTradeNo(orderOutTradeNo);
rabbitTemplate.convertAndSend(rabbitConfig.getEventExchange(),rabbitConfig.getStockReleaseDelayRoutingKey(),productMessage);
log.info("商品库存锁定信息发送成功:{}",productMessage);
第5集 商品微服务延迟消息消费-释放商品库存功能开发《上》
简介:商品库存释放回收功能开发《上》
- 商品微服务消费MQ监听器开发
- 流程梳理
商品库存解锁记录场景
1、超时未支付,比如30分钟则订单失效关闭
2、下单成功,创建订单业务失败,订单回滚
库存解锁防止继续支付:
1、30分支付超时则无法支付订单
2、订单31分延迟消息(比订单超时大几分钟)
->查询订单状态-向第三方支付查询订单状态,只有未支付状态,且本地订单状态是NEW,才修改本地订单状态为取消CANCEL,其他业务才可以解锁对应的库存库存
3、商品、优惠券库存32分延迟消息(比订单超时大几分钟)
->查询订单状态-订单不存在,解锁库存
->查询订单状态
1)订单状态为取消CANCEL的情况,才可以解锁库存,确认消息接收;
2)订单状态为未支付NEW的情况,则不解锁库存,不修改订单状态,重新投递消息或者拒收;
(避免网络延迟到 导致订单关单消息,比库存解锁还慢,没更新订单状态)
3)如果是订单已经支付则修改库存task工作单状态,确认消息接收;
注意:延迟队列一定要开启手动的ack机制,防止解锁失败,消息丢失,也要防止多次解锁
解锁库存的时候:修改状态和修改对应库存task工作单状态应该是同个事务,防止其中一个失败
第6集 数据一致性多场景用例测试-延迟消息消费释放商品库存开发《下》
简介: 商品库存回收-延迟消息消费回收功能开发《下》
- 流程测试
- 写单元测试,发送消息
- 订单支付完成用例测试
- 订单超时未支付用例测试
- 订单异常不存在用例测试
- 消息延迟,监听消息处理
- 记录更新情况
- 数据准备
- 写单元测试,发送消息
INSERT INTO `product_order` (`id`, `out_trade_no`, `state`, `create_time`, `total_amount`, `pay_amount`, `pay_type`, `nickname`, `head_img`, `user_id`, `del`, `update_time`, `order_type`, `receiver_address`)
VALUES
(1, '123456abc', 'PAY', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL);
INSERT INTO `product_task` (`id`, `product_id`, `buy_num`, `product_name`, `lock_state`, `out_trade_no`, `create_time`)
VALUES
(1, 1, 2, '杯子-小滴课堂', 'LOCK', '123456abc', '2021-02-28 16:01:52');
- 功能流程完善
- 业务逻辑优化
- 如何保证消息不会重复消费-幂等处理
- 多个消息并发情况下是否需要加锁
- 是否还有其他问题,大家可以思考下,然后给出解决方案
第三十章 1024电商平台-订单微服务下单和验价设计和开发
第1集 订单微服务下单逻辑之确认收货地址模开发
简介: 订单微服务-确认收货地址模块开发
- 订单号生产
- 获取收货地址详情
- 方案一:前端一并传递收货地址详情过来
- 少了一次网络交互
- 前后端通信包更大
- 方案二:后端根据收货地址id调用服务查询地址详情
- 多了一次网络交换
- 前后端通信包更小
- 方案一:前端一并传递收货地址详情过来
- 功能测试
- token传递失败
第2集 Feign底层源码-token令牌丢失原因分析和解决方案
简介: token令牌丢失原因分析和解决方案
- token传递失败原因分析
- 解决方案-加入到common公共类上
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor(){
return template -> {
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
if(attributes!=null){
HttpServletRequest request = attributes.getRequest();
if (null == request){
return;
}
log.info(request.getHeaderNames().toString());
template.header("token", request.getHeader("token"));
}else {
log.warn("requestInterceptor获取Header空指针异常");
}
};
}
第3集 订单微服务-下单获取商品最新价格开发
简介:订单微服务下单获取最新价格开发
- 获取最新商品价格开发
/**
* 用于订单服务,确认订单,获取全部购物项
*
* 会清空购物车对应的商品
*
* @return
*/
@ApiOperation("下单清空购物项")
@RequestMapping("confirm_order_cart_items")
public JsonData confirmOrderCartItem(@ApiParam("商品id列表") @RequestBody List<Long> productIdList ){
List<CartItemVO> cartItemVOList = cartService.confirmOrderCartItem(productIdList);
return JsonData.buildSuccess(cartItemVOList);
}
- 下单协议
{
"coupon_record_id":-1,
"product_ids":[1,2],
"pay_type":"ALIPAY",
"client_type":"H5",
"address_id":45,
"total_amount":10,
"real_pay_amount":10,
"token":"SbD5D4FLpUzemiuwSEytwGM9LLFGISDQ"
}
第4集 多种解决方案设计-购物车清空下单商品的设计思路你知道多少
简介:下单-购物车清空已经下单商品逻辑作业设计
- 需求作业
- 用户创建订单,购物车的商品什么时候进行清除
- 假如下单流程异常后,怎么回滚
- 清空购物车逻辑设计方案一
- 想加分布式事务Seata????
- 【推荐】清空购物车逻辑设计方案二
- 直接调用清空-MQ延迟消息(假如订单创建失败则购物车会丢失数据)
- 解决方案:类似库存解锁和优惠券释放一样的思路(购物车这边做)
- 延迟消息可以1分钟或者5分钟
- 直接查询订单是否存在即可(协议增加一个outTradeNo)
- 解决方案:类似库存解锁和优惠券释放一样的思路(购物车这边做)
- 直接调用清空-MQ延迟消息(假如订单创建失败则购物车会丢失数据)
- 这是一个作业,大家要自己尝试哈
第5集 订单微服务-商品验价和优惠券的抵扣功能开发《上》
简介:商品验证价格和优惠券抵扣功能开发
- 统计商品价格
- 远程调用获取优惠券
- 当前购物车是否满足优惠券使用条件
- 验证价格
第6集 订单微服务-下单锁定优惠券和商品库存逻辑开发《下》
简介:下单锁定优惠券和商品库存逻辑开发
- 锁定优惠券
- 锁定商品库存
第7集 订单微服务-创建商品订单和订单项模块开发
简介:下单创建商品订单和订单项模块开发
- 下单创建商品订单
- 下单创建商品订单项
- bug
- 数据库 product_order 表的 user_id 改为bigint类型,java类型是long
第三十一章 订单超时未支付-定时关单功能设计和开发
第1集 订单超时未支付-定时关单功能流程设计
简介:订单超时未支付-定时关单功能设计
- 业务流程梳理
- 消息消费-关单流程设计
第2集 定时关单RabbitMQ延迟消息交换机和队列配置
简介:定时关单RabbitMQ延迟消息交换机和队列配置
- 配置文件
#自定义消息队列配置,发送锁定库存消息-》延迟exchange-》lock.queue-》死信exchange-》release.queue
mqconfig:
#延迟队列,不能被监听消费
order_close_delay_queue: order.close.delay.queue
#延迟队列的消息过期后转发的队列
order_close_queue: order.close.queue
#交换机
order_event_exchange: order.event.exchange
#进入延迟队列的路由key
order_close_delay_routing_key: order.close.delay.routing.key
#消息过期,进入释放队列的key,进入死信队列的key
order_close_routing_key: order.close.routing.key
#消息过期时间,毫秒,测试改为15秒
ttl: 15000
- 配置类
/**
* 交换机
*/
@Value("${mqconfig.order_event_exchange}")
private String eventExchange;
/**
* 延迟队列
*/
@Value("${mqconfig.order_close_delay_queue}")
private String orderCloseDelayQueue;
/**
* 关单队列
*/
@Value("${mqconfig.order_close_queue}")
private String orderCloseQueue;
/**
* 进入延迟队列的路由key
*/
@Value("${mqconfig.order_close_delay_routing_key}")
private String orderCloseDelayRoutingKey;
/**
* 进入死信队列的路由key
*/
@Value("${mqconfig.order_close_routing_key}")
private String orderCloseRoutingKey;
/**
* 过期时间
*/
@Value("${mqconfig.ttl}")
private Integer ttl;
第3集 订单微服务下单-延迟消息功能测试开发和注意事项
简介:延迟消息测试和注意事项
- 测试代码编写测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = OrderApplication.class)
@Slf4j
public class DemoApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void send(){
rabbitTemplate.convertAndSend("order.event.exchange","order.close.delay.routing.key","23342342");
}
}
- 注意
- IOC容器存在不行,RabbitMQ默认是懒加载模式
- 只有微服务监听mq,才会创建对应的队列和交换机,所以编写测试方法或者写监听器就行
- 如果MQ已经存在对应的队列,则不会重新创建
- 修改配置后,需要删除队列重新建立生效
- 如果队列和交换机已经存在,重新启动项目会有错误警告,可以忽略
第4集 订单超时未支付定时关单-发送消息功能开发
简介:用户下单发送定时关单消息开发
- 消息协议介绍
@Data
public class OrderMessage {
/**
* 消息队列id
*/
private Long messageId;
/**
* 订单号
*/
private String outTradeNo;
}
- 发送功能开发
//MQ发送延迟队列 TODO,用于自动关单
OrderMessage orderMessage = new OrderMessage();
orderMessage.setOutTradeNo(orderOutTradeNo);
rabbitTemplate.convertAndSend(rabbitConfig.getEventExchange(), rabbitConfig.getOrderCloseDelayRoutingKey(), orderMessage);
第5集 订单微服务-订单超时未支付自动关单-消息监听处理
简介:订单微服务-订单超时未支付关单消息监听处理
- 订单微服务消费MQ监听器开发
- 流程梳理