• spring cloud 集成rabbitMQ实现延时队列


    假如环境已经配置好,现在我们有这么个需求,我们把消息发给消息队列后,并不希望马上消费这个消息,而是想等一段时间再让他消费,直接上代码吧:

    mq配置文件:定义一些队列名称配置

    @Configuration
    public class QueueConfiguration {  
          
        //信道配置  
        @Bean
        public DirectExchange defaultExchange() {
            return new DirectExchange(MQConstant.DEFAULT_EXCHANGE, true, false);
        }
        @Bean
        public Queue repeatTradeQueue() {
            Queue queue = new Queue(MQConstant.DEFAULT_REPEAT_TRADE_QUEUE_NAME,true,false,false);
            return queue;
        }
    
        @Bean
        public Binding  drepeatTradeBinding() {
            return BindingBuilder.bind(repeatTradeQueue()).to(defaultExchange()).with(MQConstant.DEFAULT_REPEAT_TRADE_QUEUE_NAME);
        }
    
        @Bean
        public Queue deadLetterQueue() {
            Map<String, Object> arguments = new HashMap<>();
            arguments.put("x-dead-letter-exchange", MQConstant.DEFAULT_EXCHANGE);
            arguments.put("x-dead-letter-routing-key", MQConstant.DEFAULT_REPEAT_TRADE_QUEUE_NAME);
            Queue queue = new Queue(MQConstant.DEFAULT_DEAD_LETTER_QUEUE_NAME,true,false,false,arguments);
            System.out.println("arguments :" + queue.getArguments());
            return queue;
        }
    
        @Bean
        public Binding  deadLetterBinding() {
            return BindingBuilder.bind(deadLetterQueue()).to(defaultExchange()).with(MQConstant.DEFAULT_DEAD_LETTER_QUEUE_NAME);
        }
          
        /*********************    hello 队列  测试    *****************/  
        @Bean  
        public Queue queue() {
            Queue queue = new Queue(MQConstant.HELLO_QUEUE_NAME,true);  
            return queue;   
        }  
      
        @Bean  
        public Binding binding() {
            return BindingBuilder.bind(queue()).to(defaultExchange()).with(MQConstant.HELLO_QUEUE_NAME);
        }  
      
    }  

    队列常量:

    public final class MQConstant {
          
        private MQConstant(){  
        }  
          
        //exchange name  
        public static final String DEFAULT_EXCHANGE = "test-exchange";
          
        //DLX QUEUE  
        public static final String DEFAULT_DEAD_LETTER_QUEUE_NAME = "kshop.dead.letter.queue";  
          
        //DLX repeat QUEUE 死信转发队列  
        public static final String DEFAULT_REPEAT_TRADE_QUEUE_NAME = "kshop.repeat.trade.queue";  
          
          
        //Hello 测试消息队列名称  
        public static final String HELLO_QUEUE_NAME = "test-queue-name";
          
          
    } 

    消息类:

    public class DLXMessage implements Serializable {
    
        private static final long serialVersionUID = 9956432152000L;  
    
        public DLXMessage() {  
            super();  
        }  
    
        public DLXMessage(String queueName, String content, long times) {  
            super();  
            this.queueName = queueName;  
            this.content = content;  
            this.times = times;  
        }  
    
        public DLXMessage(String exchange, String queueName, String content, long times) {  
            super();  
            this.exchange = exchange;  
            this.queueName = queueName;  
            this.content = content;  
            this.times = times;  
        }  
    
    
        private String exchange;  
    
        private String queueName;  
    
        private String content;  
    
        private long times;  
    
        //省略getter setter  
    
        public static long getSerialVersionUID() {
            return serialVersionUID;
        }
    
        public String getExchange() {
            return exchange;
        }
    
        public void setExchange(String exchange) {
            this.exchange = exchange;
        }
    
        public String getQueueName() {
            return queueName;
        }
    
        public void setQueueName(String queueName) {
            this.queueName = queueName;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public long getTimes() {
            return times;
        }
    
        public void setTimes(long times) {
            this.times = times;
        }
    }

    消息发送对象:

    @Service("messageQueueService")
    public class MessageQueueServiceImpl implements IMessageQueueService {
          
        @Autowired
        private RabbitTemplate rabbitTemplate;
      
        @Override  
        public void send(String queueName, String msg) {  
            rabbitTemplate.convertAndSend(MQConstant.DEFAULT_EXCHANGE,queueName, msg);
        }
    
        @Override
        public void send(String queueName, String message, long times) {
    
            DLXMessage dlxMessage = new DLXMessage(queueName,message,times);
            MessagePostProcessor processor = new MessagePostProcessor(){
                @Override
                public Message postProcessMessage(Message message) throws AmqpException {
                    message.getMessageProperties().setExpiration(times + "");
                    return message;
                }
            };
            dlxMessage.setExchange(MQConstant.DEFAULT_EXCHANGE);
            rabbitTemplate.convertAndSend(MQConstant.DEFAULT_EXCHANGE,MQConstant.DEFAULT_DEAD_LETTER_QUEUE_NAME, JSON.toJSONString(dlxMessage), processor);
    
    
        }
    
    
    }  
  • 相关阅读:
    sparksql解析流程
    推荐算法简介:基于用户的协同过滤、基于物品的协同过滤、基于内容的推荐
    数据中台
    拉链表
    大数据去重与布隆过滤器
    推荐算法简介
    java获取resources文件夹中文件的路径
    Flink中设置事件时间
    [转载]REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案
    使用Gson或者jackson代替Fastjson
  • 原文地址:https://www.cnblogs.com/longyao/p/11720069.html
Copyright © 2020-2023  润新知