Rabbitmq延时队列的简单实现方式

1、什么是死信队列

当消息在一个队列中变成一个死信之后, 它将被重新publish到另一 个交换机上, 这个交换机
我们就叫做死信交换机,**交换机将死信投递到一个队列上就是死信队列。具体原理如图

 2、项目搭建

       创建boot项目并选择rabbitmq对应版本

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

       创建相关的交换机和队列

package com.wkt.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

/**
 * @author 小王
 * @version 1.1
 * @description: Class
 * @date 2021/9/7 19:08
 */
@Configuration
public class RabbitMqConfig {

    //忽略我的命名  哈哈哈哈


    //队列名字
    public final static String QueueName = "orderQueue";
    //交换机名字
    public final static String mqExchange = "orderExchange";
    //routingKey
    public final static String mqRoutingKey = "mqRoutingKey";

    //死信队列名字
    public final static String dieMqQueue = "dieMqQueue";
    //死信队列交换机
    public final static String dieMqExchange = "dieMqExchange";
    //死信队列 routingKey
    public final static String dieMqRoutingKey = "dieMqRoutingKey";

    //死信队列标识符"
    public final static String dieMqTag = "x-dead-letter-exchange";
    //死信队列交换机标识符 routing key
    public final static String DieMqExchangeTag = "x-dead-letter-routing-key";

    //创建队列
    @Bean
    public Queue orderQueue() {
        HashMap<String, Object> map = new HashMap<>(2);
        map.put(dieMqTag, dieMqExchange);
        map.put(DieMqExchangeTag, dieMqRoutingKey);
        return new Queue(QueueName, true, false, false, map);
    }

    //声明交换机
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(mqExchange);
    }

    //绑定order队列到交换机 指定routingKey
    @Bean
    public Binding binding() {
        return BindingBuilder.bind(orderQueue()).to(directExchange()).with(mqRoutingKey);
    }

    //创建死信队列
    @Bean
    public Queue dieQueue() {
        return new Queue(dieMqQueue, true);
    }

    //创建私信交换机
    @Bean
    public DirectExchange dieDirectExchange() {
        return new DirectExchange(dieMqExchange);
    }

    //死信队列的routingKey绑定
    @Bean
    public Binding dieBinDing() {
        return BindingBuilder.bind(dieQueue()).to(dieDirectExchange()).with(dieMqRoutingKey);
    }
}

       发送消息类

package com.wkt.controller;

import com.wkt.config.RabbitMqConfig;
import lombok.extern.java.Log;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.UUID;

/**
 * @author 小王
 * @version 1.1
 * @description: Class
 * @date 2021/9/7 19:33
 * 消息生产设 客户端
 */
@Log
@RestController
public class OrderConsumption {

    @Resource
    private RabbitTemplate rabbitTemplate;

    //生产设发送消息
    @RequestMapping("/sendMessage")
    public String sendMessage() {
        String s = UUID.randomUUID().toString();
        log.info(s);
        rabbitTemplate.convertAndSend(
                RabbitMqConfig.mqExchange,//订单交换机
                RabbitMqConfig.mqRoutingKey,//订单routingKey
                s, //发送的队列名字
                message -> { //设置消息过期时间
                    message.getMessageProperties().setExpiration(1000 * 10 + "");
                    return message;
                }
        );
        return s;
    }
}

       创建接收消息的监听类

package com.wkt.listene;

import com.wkt.config.RabbitMqConfig;
import lombok.extern.java.Log;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;


/**
 * @author 小王
 * @version 1.1
 * @description: Class
 * @date 2021/9/7 20:10
 */
@Component
@Log
public class RabbitmqListener {
    //获取死信队列的名字
    final String queue = RabbitMqConfig.dieMqQueue;

    //监听死信队列
    @RabbitListener(queues = queue)
    public void message(String order) {
        log.info(order);
        System.out.println("执行结束2");
    }
}

       配置文件

#项目运行端口
server:
  port: 8081

#mq的相关配置
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

3、效果

        通过网页发送消息

        后台接收打印

以上便是一个简单的死信队列搭建 可以用在很多场景 例如 交易订单

大佬们快快动起手来吧 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值