栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot结合rabbitmq的延时队列实现订单超时自动关闭(附源码)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot结合rabbitmq的延时队列实现订单超时自动关闭(附源码)

源代码:点我0积分下载

1.环境搭建 (1).安装rabbitmq(适用于centos,windows版本自行百度)
docker pull rabbitmq:management

启动

docker run -d --name rabbitmq --publish 5671:5671 
--publish 5672:5672 --publish 4369:4369 --publish 25672:25672 --publish 15671:15671 --publish 15672:15672 
rabbitmq:management
docker update rabbitmq --restart=always

注:
4369 – erlang发现口
5672 --client端通信口

15672 – 管理界面ui端口
25672 – server间内部通信口

(2).创建springboot项目

添加rabbitmq的maven依赖

	
           org.springframework.boot
           spring-boot-starter-amqp
    
3.代码实现 (1).创建rabbitmq的配置类
@Configuration
public class MyMqConfig {

    @Bean
    public Queue orderDelayQueue() {
        //String name, boolean durable, boolean exclusive, boolean autoDelete, @Nullable Map arguments
        //名字、是否持久化、是否排他、是否自动删除、自定义属性....
        Map arguments = new HashMap<>();
        //死信路由
        arguments.put("x-dead-letter-exchange","order-exchange");
        //死信路由键
        arguments.put("x-dead-letter-routing-key","order-release");
        //消息过期时间、单位:毫秒、60000代表1分钟
        arguments.put("x-message-ttl",60000);
        return new Queue("order-delay-queue",true,false,false,arguments);
    }

    @Bean
    public Queue orderReleaseOrderQueue() {
        return new Queue("order-release-queue",true,false,false);
    }

    @Bean
    public Exchange orderExchange() {
        return new TopicExchange("order-exchange",true,false);
    }

    @Bean
    public Binding orderCreate() {
        //String destination, Binding.DestinationType destinationType, String exchange, String routingKey, @Nullable Map arguments
        //目的地、目的地类型、交换机、路由键
        return new Binding("order-delay-queue",Binding.DestinationType.QUEUE,"order-exchange","order-create",null);
    }

    @Bean
    public Binding orderRelease() {
        return new Binding("order-release-queue",Binding.DestinationType.QUEUE,"order-exchange","order-release",null);
    }
}

(2).创建订单模拟实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order implements Serializable {
    private String id;//订单编号
    private String content;//订单内容
    private String state;//订单状态
    private String createTime;//创建时间
    private String cancelTime;//取消时间
}
(3).创建监听队列
@Component
public class MqListener {

    
    @RabbitListener(queues = "order-release-queue")
    public void listener(Order order, Message message,Channel channel) throws IOException {
        System.out.println("接收到过期未支付的订单信息"+order);
        System.out.println("处理过期订单....");
        try{
            //TODO 判断订单是否已经支付成功,如果支付成功,无需再取消订单
            order.setCancelTime(new Date().toString());
            order.setState("已过期");
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);//是否批量签收
        }catch (Exception e) {
            channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);//是否重新入队
        }
        System.out.println("处理后的订单:"+order);
    }

}

(4).创建订单控制器的实现(模拟创建订单)
@RestController
public class MqController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    
    @GetMapping("/createOrder")
    public String createOrder(){
        //订单下单成功
        Order order = new Order(UUID.randomUUID().toString(), "订单商品信息", "未支付",new Date().toString(),null);
        //给mq发送消息
        rabbitTemplate.convertAndSend("order-exchange","order-create",order);
        return "下单成功"+order;
    }

	
    @GetMapping("/pay/{id}")
    public String pay(@PathVariable("id") String id){
		//TODO 修改订单状态为支付成功
        return id+"支付成功";
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/726692.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号