Springboot使用RabbitMQ实现关闭超时订单的一个简单示例

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

1.maven中引入rabbitmq的依赖:
  1.         <dependency>
  2.             <groupId>org.springframework.boot</groupId>
  3.             <artifactId>spring-boot-starter-amqp</artifactId>
  4.         </dependency>
复制代码
2.application.yml中进行rabbitmq相干设置:
  1. # rabbitmq空一格写,内嵌在spring里边
  2. rabbitmq:
  3.     host: 192.168.56.10
  4.     port: 5672
  5.     virtual-host: /
  6.     #发送端确认机制 correlated:发布消息成功到交换器后会触发回调方法
  7.     publisher-confirm-type: correlated
  8.     template:
  9.     # 只要抵达队列,以异步发送优先回调以异步发送优先回调我们这个returnconfirm
  10.       mandatory: true
  11.     # 开启发送消息抵达队列的确认
  12.     publisher-returns: true
复制代码
 在项目启动类中添加开启rabbitmq的注解@EnableRabbit
3.创建交换机,队列,并将队列绑定到指定交换机:
  1. import com.atguigu.gulimall.order.entity.OrderEntity;
  2. import com.rabbitmq.client.Channel;
  3. import org.springframework.amqp.core.*;
  4. import org.springframework.amqp.rabbit.annotation.RabbitListener;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import java.io.IOException;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. @Configuration
  11. public class MyMQConfig {
  12.     @Bean
  13.     public Queue orderDelayQueue(){
  14.         /* * 构造一个死信队列
  15.          *  x-dead-letter-exchange: order-event-exchange
  16.          *  x-dead-letter-routing-key: order.release.order
  17.          *  x-message-ttl: 60000
  18.          * @create 2025/1/1
  19.          **/
  20.         Map<String,Object>arguments=new HashMap<>();
  21.         arguments.put("x-dead-letter-exchange","order-event-exchange");
  22.         arguments.put("x-dead-letter-routing-key","order.release.order");
  23.         arguments.put("x-message-ttl",60000);
  24.         Queue queue = new Queue("order.delay.queue", true, false, false,arguments);
  25.         return queue;
  26.     }
  27.     @Bean
  28.     public Queue orderReleaseOrderQueue(){
  29.         Queue queue = new Queue("order.release.order.queue", true, false, false);
  30.         return queue;
  31.     }
  32.     @Bean
  33.     public Exchange orderEventExchange(){
  34.        return new TopicExchange("order-event-exchange",true,false);
  35.     }
  36.     @Bean
  37.     public Binding orderCreateOrderBinding(){
  38.        return new Binding("order.delay.queue", Binding.DestinationType.QUEUE,"order-event-exchange","order.create.order",null);
  39.     }
  40.     @Bean
  41.     public Binding orderReleaseOrderBinding(){
  42.         return new Binding("order.release.order.queue", Binding.DestinationType.QUEUE,"order-event-exchange","order.release.order",null);
  43.     }
  44. }
复制代码
 在上面的代码中,创建了2个队列:order.delay.queue和order.release.order.queue,此中order.delay.queue是延时队列,为了方便演示,将延时时间设置为1分钟(60000ms)。order.release.order.queue是普通队列。创建了1个交换机:order-event-exchange。order.delay.queue队列通过路由键order.create.order绑定到order-event-exchange交换机,order.release.order.queue队列通过路由键order.release.order也绑定到order-event-exchange交换机。在交换机的选择上,思量到要绑定到不同的队列和路由键,支持模糊匹配,这里使用Topic交换机。
4.在MyMQConfig 创建一个方法监听队列:
  1.     @RabbitListener(queues = "order.release.order.queue")
  2.     public void listener(OrderEntity order, Channel channel, Message message) throws IOException {
  3.         System.out.println("收到过期的订单信息,准备关闭订单"+order.getOrderSn());
  4.         channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
  5.     }
复制代码
 添加上面的方法后,当我们的服务连上rabbitmq,rabbitmq就会创建上面@Bean标注的交换机和队列了。
5.写一个创建订单的接口,简单模仿下这个过程:
  1.     @Autowired
  2.     private RabbitTemplate rabbitTemplate;
  3.     @GetMapping("/test/createOrder")
  4.     @ResponseBody
  5.     public String creatOrder(){
  6.         OrderEntity order=new OrderEntity();
  7.         order.setOrderSn(UUID.randomUUID().toString());
  8.         order.setCreateTime(new Date());
  9.         rabbitTemplate.convertAndSend("order-event-exchange","order.create.order",order);
  10.         return "ok";
  11.     }
复制代码
使用rabbitTemplate将订单数据通过交换机order-event-exchange和路由键order.create.order将订单数据order发送给队列order.delay.queue。启动服务调用接口,来观察rabbitmq背景队列的变化:

可以看到 order.delay.queue队列中有1条消息等候消耗,由于rabbitmq背景每隔5秒刷新一次,过1分钟再去看,队列中已有消息了。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表