rabbitmq延迟队列demo

yml配置类

# 应用名称
spring:
  application:
    name: springboot-rabbitmq-demo
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

config 配置类

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class TtlDealQueueConfig {
    
    

    //正常的延迟交换机
    private static final String TTL_NORMAL_EXCHANGE = "ttl_test_exchange";
    //routingKey
    private static final String TTL_TEST_ROUTING_KEY = "ttl_test_routing_key";
    // 死信队列交换机
    private static final String DEAD_TEST_EXCHANGE = "dead_test_exchange";
    // //routingKey
    private static final String DEAD_TEST_ROUTING_KEY = "dead_test_routing_key";

    //延迟队列名称
    private static final String TTL_TEST_QUEUE = "ttl_test_queue";
    //死信队列名称
    private static final String DEAD_TEST_QUEUE = "dead_test_queue";


    @Bean("ttlTestExchange")
    public DirectExchange ttlTestExchange() {
    
    
        return new DirectExchange(TTL_NORMAL_EXCHANGE);
    }

    @Bean("deadTestExchange")
    public DirectExchange deadTestExchange() {
    
    
        return new DirectExchange(DEAD_TEST_EXCHANGE);
    }
    
    @Bean("ttlTestQueue")
    public Queue ttlTestQueue() {
    
    
        Map<String, Object> map = new HashMap<>();
        map.put("x-dead-letter-exchange", DEAD_TEST_EXCHANGE);
        map.put("x-dead-letter-routing-key", DEAD_TEST_ROUTING_KEY);
        return QueueBuilder.durable(TTL_TEST_QUEUE).withArguments(map).build();
    }
    @Bean("deadTestQueue")
    public Queue deadTestQueue() {
    
    
        return QueueBuilder.durable(DEAD_TEST_QUEUE).build();
    }

    //绑定队列交换机
    @Bean
    public Binding queueBindingTtl(@Qualifier("ttlTestQueue") Queue ttlTestQueue,
                                   @Qualifier("ttlTestExchange") DirectExchange ttlTestExchange) {
    
    

        return BindingBuilder.bind(ttlTestQueue).to(ttlTestExchange).with(TTL_TEST_ROUTING_KEY);
    }

    @Bean
    public Binding queueBindingDead(@Qualifier("deadTestQueue") Queue deadTestQueue,
                                   @Qualifier("deadTestExchange") DirectExchange deadTestExchange) {
    
    

        return BindingBuilder.bind(deadTestQueue).to(deadTestExchange).with(DEAD_TEST_ROUTING_KEY);
    }
}

生产者


import java.lang.annotation.Target;
import java.util.Date;


@Slf4j
@RestController
@RequestMapping("/ttl")
public class ProducerContrller {
    
    
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/sendMsg/{message}/{ttlTime}")
    public void sendMsg(@PathVariable String message,@PathVariable String ttlTime){
    
    
        log.info("当前时间:{},发送一条消息给ttl队列:{},ttl时长:{}ms", new Date().toInstant(), message,ttlTime);
        rabbitTemplate.convertAndSend("ttl_test_exchange", "ttl_test_routing_key", message, msg -> {
    
    
            msg.getMessageProperties().setExpiration(ttlTime);
            return msg;
        });
    };
}


消费者


import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Date;


@Slf4j
@Component
public class DeadConsumer {
    
    
    @RabbitListener(queues = "dead_test_queue")
    public void receiveDeadMsg(Message message, Channel channel) throws Exception {
    
    
        String msg = message.getBody().toString();
        log.info("当前时间:{},收到的死信消息",new Date().toInstant() ,msg);
    }
}

猜你喜欢

转载自blog.csdn.net/m0_46213587/article/details/126831093