mq delay queue usage

1. Basic configuration

  1. Import dependencies
        <!--高级消息队列协议amqp-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

  1. application.yml configuration
  #rabbitmq
  rabbitmq:
    host: 192.168.56.10
    virtual-host: /
    port: 5672
  1. Add annotation to startup class
@EnableRabbit
  1. Configure mq's json serialization
@Configuration
public class RabbitmqConfig {
    
    

    @Autowired
    RabbitTemplate rabbitTemplate;

    @Bean
    public MessageConverter RabbitmqConvertJSON(){
    
    
        return new Jackson2JsonMessageConverter();
    }


}

  1. Configure switches, queues, and binding rules
	@Bean
    public Exchange StockEventExchange(){
    
    
        //TopicExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
        return new TopicExchange("stock-event-exchange",true,false);
    }

    @Bean
    public Queue StockReleaseStockQueue(){
    
    
        //Queue(String name, boolean durable, boolean exclusive, boolean autoDelete)
        return new Queue("stock.release.stock.queue",true,false,false);
    }

    @Bean
    public Queue StockDelayQueue(){
    
    
        Map<String,Object> map = new HashMap<>();
        //死信路由exchange
        map.put("x-dead-letter-exchange","stock-event-exchange");
        //死信routing-key
        map.put("x-dead-letter-routing-key","stock.release");
        //time to live
        map.put("x-message-ttl",60000);
        return new Queue("stock.delay.queue",true,false,false,map);
    }

    @Bean
    public Binding StockLocked(){
    
    
        //Binding(String destination, Binding.DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments)
        return new Binding("stock.delay.queue", Binding.DestinationType.QUEUE,"stock-event-exchange","stock.locked",null);
    }

    @Bean
    public Binding StockRelease(){
    
    
        return new Binding("stock.release.stock.queue",Binding.DestinationType.QUEUE,"stock-event-exchange","stock.release.#",null);
    }
  1. Establish a connection to generate switches, queues, and binding rules in mq
	@RabbitListener(queues = {
    
    "stock.release.stock.queue"})
    public void ListenQueue(Message message, Channel channel){
    
    

    }

2. Order service uses mq

Insert image description here
1. Generate queues, switches, and binding rules

/**
 * 如果设置错误需要删掉错误的Queue重启服务即可,重启服务不会覆盖原有的Queue
 */
@Configuration
public class MyMQConfig {
    
    

    @Bean
    public Queue OrderDelayQueue(){
    
    
        Map<String,Object> map = new HashMap<>();
        //死信路由
        map.put("x-dead-letter-exchange","order-event-exchange");
        //死信
        map.put("x-dead-letter-routing-key","order.release.order");
        //time to live
        map.put("x-message-ttl",30000);

        //持久化,排它
        //Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
        return new Queue("order.delay.order",true,false,false,map);
    }

    @Bean
    public Queue OrderReleaseOrderQueue(){
    
    
        return new Queue("order.release.order.queue",true,false,false,null);
    }

    //选用topic类型交换机是因为需要binding多个队列
    @Bean
    public Exchange OrderEventExchange(){
    
    
        //TopicExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
        return new TopicExchange("order-event-exchange",true,false,null);
    }

    @Bean
    public Binding OrderCreateOrder(){
    
    
        //Binding(String destination, Binding.DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments)
        return new Binding("order.delay.order", Binding.DestinationType.QUEUE,"order-event-exchange","order.create.order",null);
    }

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


}

2. Producer sends message

@ResponseBody
    @GetMapping("/test/queue")
    public String testQueue(){
    
    
        OrderEntity orderEntity = new OrderEntity();
        orderEntity.setOrderSn(UUID.randomUUID().toString());
        //给队列发消息,指定routing key
        //convertAndSend(String exchange, String routingKey, Object object)
        rabbitTemplate.convertAndSend("order-event-exchange","order.create.order",orderEntity);
        return "给mq发消息完成";
    }

3. Subscribe to the queue

@RabbitListener(queues = {
    
    "order.release.order.queue"})
    public void ListenQueue(Channel channel, Message message, OrderEntity orderEntity) throws IOException {
    
    
        //因为配置了手动ack,所有这里需要签收消息
        //basicAck(long deliveryTag, boolean multiple)
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        System.out.println("手动过期的订单信息,准备关闭订单:"+orderEntity.getOrderSn());
    }

3. Inventory service uses mq

Insert image description here

@Configuration
public class RabbitmqConfig {
    
    

    @Autowired
    RabbitTemplate rabbitTemplate;

    @RabbitListener(queues = {
    
    "stock.release.stock.queue"})
    public void ListenQueue(Message message, Channel channel){
    
    

    }

    /**
     * json序列化
     */
    @Bean
    public MessageConverter RabbitmqConvertJSON(){
    
    
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public Exchange StockEventExchange(){
    
    
        //TopicExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
        return new TopicExchange("stock-event-exchange",true,false);
    }

    @Bean
    public Queue StockReleaseStockQueue(){
    
    
        //Queue(String name, boolean durable, boolean exclusive, boolean autoDelete)
        return new Queue("stock.release.stock.queue",true,false,false);
    }

    @Bean
    public Queue StockDelayQueue(){
    
    
        Map<String,Object> map = new HashMap<>();
        //死信路由exchange
        map.put("x-dead-letter-exchange","stock-event-exchange");
        //死信routing-key
        map.put("x-dead-letter-routing-key","stock.release");
        //time to live
        map.put("x-message-ttl",60000);
        return new Queue("stock.delay.queue",true,false,false,map);
    }

    @Bean
    public Binding StockLocked(){
    
    
        //Binding(String destination, Binding.DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments)
        return new Binding("stock.delay.queue", Binding.DestinationType.QUEUE,"stock-event-exchange","stock.locked",null);
    }

    @Bean
    public Binding StockRelease(){
    
    
        return new Binding("stock.release.stock.queue",Binding.DestinationType.QUEUE,"stock-event-exchange","stock.release.#",null);
    }

}

Guess you like

Origin blog.csdn.net/weixin_44847885/article/details/131691065