SpringBoot结合RabbitMQ简单实现订单延迟取消

参考了这位大佬的博客,详细看这里

1.导入jar包

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <scope>provided</scope>
        </dependency>

2.配置application.properties文件

server.port=8001
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

3.时间常量类

/**
 * 配置时间常量
 */
public interface TimeConstants {
    /*
     * 5秒
     */
    Long TEST_TIME = 5 * 1000L;
}

4.定义队列,交换机,路由键枚举类

/**
 * 订单队列
 */
public enum QueueEnum {
    /**
     * 订单延时队列
     */
    QUEUE_ORDER_CANCEL("mall.order.direct","mall.order.cancel","mall.order.cancel"),
    /**
     * 订单延时ttl队列(死信队列)
     */
    QUEUE_TTL_ORDER_CANCEL("mall.order.direct","mall.order.cancel.ttl","mall.order.cancel.ttl");
    /**
     * 交换名称
     */
    private String exchange;
    /**
     * 队列名称
     */
    private String name;
    /**
     * 路由键
     */
    private String routeKey;

    QueueEnum(String exchange,String name,String routeKey){
        this.exchange = exchange;
        this.name = name;
        this.routeKey = routeKey;
    }

    public String getExchange(){
        return exchange;
    }

    public String getName(){
        return name;
    }

    public String getRouteKey(){
        return routeKey;
    }
}

5.绑定队列,交换机,路由键(这里采用的直连交换机)

6.消息生产者

7.消息消费者

@Slf4j
@Component
public class TestReceiver {
    @RabbitListener(queues = "mall.order.cancel") //设置队列路由键和监听容器
    public void handle(String orderId, Message message, Channel channel) throws IOException {
       	// 可在这里进行一些逻辑操作
        if(orderId.equals("1")){
            System.out.println("消费成功,订单编号为: "+orderId);
        }
        // TODO 通知MQ消息已经成功消费,确认消息
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    }
}

8.编写controller类

@RestController
public class TestController {
    private static Logger logger = LoggerFactory.getLogger(TestController.class);

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private TestSender testSender;

    @GetMapping("/test")
    public String test(){
        testSender.sendMessage("1",TimeConstants.TEST_TIME);
        return "ok";
    }
}

9.上手效果图

浏览器输入http://localhost:8001/test

5秒后:

经验分享 程序员 微信小程序 职场和发展