订单服务以及优惠券服务及rabbitmq(7)-1024电商平台项目技术选择和创 建聚合工程项目【工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战】

2022-09-16 16:39:55 浏览数 (1)

第二十七章 新版消息队列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/
代码语言:javascript复制
#拉取镜像
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 密码
  • 主要端口介绍
代码语言:javascript复制
4369 erlang 发现口

5672 client 端通信口

15672 管理界面 ui 端口

25672 server 间内部通信口

访问管理界面

  • ip:15672

注意事项!!!!

  • Linux服务器检查防火墙是否关闭
  • 云服务器检查网络安全组是否开放端口
代码语言:javascript复制
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项目添加依赖
代码语言:javascript复制
       <!--引入AMQP-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-amqp</artifactId>
       </dependency>
  • 各个微服务添加配置
代码语言:javascript复制
  #消息队列
  rabbitmq:
    host: 8.129.113.233
    port: 5672
    virtual-host: /
    password: password
    username: admin
    #开启手动确认消息
    listener:
      simple:
        acknowledge-mode: manual
  • 其他自定义配置后续添加

第二十八章 下单-优惠券记录锁定和释放功能设计开发

第1集 商品下单锁定优惠券记录模块开发

简介:商品下单锁定优惠券记录模块开发

  • 协议设计
代码语言:javascript复制
    /**
     * 记录id
     */
    private List<Long> lockCouponRecordIds;

    /**
     * 订单号
     */
    private String orderOutTradeNo;
  • controlle层接口开发
  • service层开发
第2集 优惠券微服务RabbitMQ延迟消息交换机和队列配置

简介:优惠券微服务RabbitMQ延迟消息交换机和队列配置

  • 配置文件
代码语言:javascript复制
#自定义消息队列配置,发送锁定库存消息-》延迟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
  • 配置类
代码语言:javascript复制
    /**
     * 交换机
     */
    @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集 延迟消息功能测试开发和注意事项

简介:延迟消息测试和注意事项

  • 测试代码编写测试
代码语言:javascript复制
@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集 优惠券锁定-发送延迟消息功能开发

简介:优惠券微服务发送延迟消息开发

  • 消息协议介绍
代码语言:javascript复制
@Data
public class CouponRecordMessage {

    /**
     * 消息队列id
     */
    private Long messageId;

    /**
     * 订单号
     */
    private String outTradeNo;

    /**
     * 库存锁定工作单id
     */
    private Long taskId;

}
  • 发送功能开发
代码语言:javascript复制
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监听器开发
  • 流程梳理
代码语言:javascript复制
优惠券解锁记录场景
  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变量名称
  • 数据准备
代码语言:javascript复制
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集 商品下单-商品库存锁定模块设计和开发

简介:商品下单-锁定商品库存模块开发

  • 协议设计
代码语言:javascript复制
@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延迟消息交换机和队列配置

  • 配置文件
代码语言:javascript复制
#自定义消息队列配置,发送锁定库存消息-》延迟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
  • 配置类
代码语言:javascript复制
    /**
     * 交换机
     */
    @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集 商品锁定-延迟消息功能测试开发和注意事项

简介:延迟消息测试和注意事项

  • 测试代码编写测试
代码语言:javascript复制
@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集 商品库存锁定-发送延迟消息功能开发

简介:商品微服务发送延迟消息开发

  • 消息协议介绍
代码语言:javascript复制
@Data
public class ProductMessage {

    /**
     * 消息队列id
     */
    private Long messageId;


    /**
     * 订单号
     */
    private String outTradeNo;

    /**
     * 库存锁定工作单id
     */
    private Long taskId;

}
  • 发送功能开发
代码语言:javascript复制
//发送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监听器开发
  • 流程梳理
代码语言:javascript复制
商品库存解锁记录场景
  1、超时未支付,比如30分钟则订单失效关闭
  2、下单成功,创建订单业务失败,订单回滚
 
 
库存解锁防止继续支付:
1、30分支付超时则无法支付订单
 
2、订单31分延迟消息(比订单超时大几分钟)
            ->查询订单状态-向第三方支付查询订单状态,只有未支付状态,且本地订单状态是NEW,才修改本地订单状态为取消CANCEL,其他业务才可以解锁对应的库存库存
 
3、商品、优惠券库存32分延迟消息(比订单超时大几分钟)
  ->查询订单状态-订单不存在,解锁库存
  ->查询订单状态
    1)订单状态为取消CANCEL的情况,才可以解锁库存,确认消息接收;
    2)订单状态为未支付NEW的情况,则不解锁库存,不修改订单状态,重新投递消息或者拒收;
      (避免网络延迟到 导致订单关单消息,比库存解锁还慢,没更新订单状态)
    3)如果是订单已经支付则修改库存task工作单状态,确认消息接收;
 
注意:延迟队列一定要开启手动的ack机制,防止解锁失败,消息丢失,也要防止多次解锁
    解锁库存的时候:修改状态和修改对应库存task工作单状态应该是同个事务,防止其中一个失败
第6集 数据一致性多场景用例测试-延迟消息消费释放商品库存开发《下》

简介: 商品库存回收-延迟消息消费回收功能开发《下》

  • 流程测试
    • 写单元测试,发送消息
      • 订单支付完成用例测试
      • 订单超时未支付用例测试
      • 订单异常不存在用例测试
    • 消息延迟,监听消息处理
    • 记录更新情况
    • 数据准备
代码语言:javascript复制
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公共类上
代码语言:javascript复制
@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集 订单微服务-下单获取商品最新价格开发

简介:订单微服务下单获取最新价格开发

  • 获取最新商品价格开发
代码语言:javascript复制
 /**
     * 用于订单服务,确认订单,获取全部购物项
     *
     * 会清空购物车对应的商品
     *
     * @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);
    }
  • 下单协议
代码语言:javascript复制
{
  "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)
  • 这是一个作业,大家要自己尝试哈
第5集 订单微服务-商品验价和优惠券的抵扣功能开发《上》

简介:商品验证价格和优惠券抵扣功能开发

  • 统计商品价格
  • 远程调用获取优惠券
  • 当前购物车是否满足优惠券使用条件
  • 验证价格
第6集 订单微服务-下单锁定优惠券和商品库存逻辑开发《下》

简介:下单锁定优惠券和商品库存逻辑开发

  • 锁定优惠券
  • 锁定商品库存
第7集 订单微服务-创建商品订单和订单项模块开发

简介:下单创建商品订单和订单项模块开发

  • 下单创建商品订单
  • 下单创建商品订单项
  • bug
    • 数据库 product_order 表的 user_id 改为bigint类型,java类型是long

第三十一章 订单超时未支付-定时关单功能设计和开发

第1集 订单超时未支付-定时关单功能流程设计

简介:订单超时未支付-定时关单功能设计

  • 业务流程梳理
    • 消息消费-关单流程设计
第2集 定时关单RabbitMQ延迟消息交换机和队列配置

简介:定时关单RabbitMQ延迟消息交换机和队列配置

  • 配置文件
代码语言:javascript复制
#自定义消息队列配置,发送锁定库存消息-》延迟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
  • 配置类
代码语言:javascript复制
    /**
     * 交换机
     */
    @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集 订单微服务下单-延迟消息功能测试开发和注意事项

简介:延迟消息测试和注意事项

  • 测试代码编写测试
代码语言:javascript复制
@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集 订单超时未支付定时关单-发送消息功能开发

简介:用户下单发送定时关单消息开发

  • 消息协议介绍
代码语言:javascript复制
@Data
public class OrderMessage {

    /**
     * 消息队列id
     */
    private Long messageId;


    /**
     * 订单号
     */
    private String outTradeNo;

}
  • 发送功能开发
代码语言:javascript复制
 //MQ发送延迟队列 TODO,用于自动关单
OrderMessage orderMessage = new OrderMessage();
orderMessage.setOutTradeNo(orderOutTradeNo);
rabbitTemplate.convertAndSend(rabbitConfig.getEventExchange(), rabbitConfig.getOrderCloseDelayRoutingKey(), orderMessage);
第5集 订单微服务-订单超时未支付自动关单-消息监听处理

简介:订单微服务-订单超时未支付关单消息监听处理

  • 订单微服务消费MQ监听器开发
  • 流程梳理

0 人点赞