RabbitMQ ----延时队列

TTL

RabbitMQ可以针对队列设置x-expires(则队列中所有的消息都有相同的过期时间)或者针对Message设置x-message-ttl(对消息进行单独设置,每条消息TTL可以不同),来控制消息的生存时间,如果超时(两者同时设置以最先到期的时间为准),则消息变为dead letter(死信)

 

Dead Letter Exchanges(DLX

RabbitMQ的Queue可以配置x-dead-letter-exchange和x-dead-letter-routing-key(可选)两个参数,如果队列内出现了dead letter,则按照这两个参数重新路由转发到指定的队列。

x-dead-letter-exchange:出现dead letter之后将dead letter重新发送到指定exchange

x-dead-letter-routing-key:出现dead letter之后将dead letter重新按照指定的routing-key发送

 

package com.message.delay;

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

/**
 * @ClassName HelloController
 * @Description TODO
 * @Author zengjx
 * @Company zengjx
 * @Date 2019/12/2  19:52
 * @Version V1.0
 */
@Configuration
public class QueueConfig {
    /** 短信接收队列 */
    public static final String QUEUE_MESSAGE = "queue.message";

    /** 交换机 */
    public static final String DLX_EXCHANGE = "dlx.exchange";

    /** 短信发送队列 延迟缓冲(收消息) */
    public static final String QUEUE_MESSAGE_DELAY = "queue.message.delay";

//------------------------------接收消息队列---------------------------------
    /**
     * 短信接收队列
     * @return
     */
    @Bean
    public Queue messageQueue() {
        return new Queue(QUEUE_MESSAGE, true);
    }
//--------------------------发送消息队列----------------------------
    /**
     * 短信发送队列
     * @return
     */
    @Bean
    public Queue delayMessageQueue() {
        //durable(死信队列)
        return QueueBuilder.durable(QUEUE_MESSAGE_DELAY)
                // 消息超时进入死信队列,绑定死信队列交换机
                .withArgument("x-dead-letter-exchange", DLX_EXCHANGE)
                // 绑定指定转发的routing-key
                .withArgument("x-dead-letter-routing-key", QUEUE_MESSAGE)
                .build();
    }

    //---------------绑定交换机与队列----------------
    /***
     * 创建交换机
     * @return
     */
    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange(DLX_EXCHANGE);
    }
    /***
     * 交换机与队列绑定
     * @param messageQueue
     * @param directExchange
     * @return
     */
    @Bean
    public Binding basicBinding(Queue messageQueue, DirectExchange directExchange) {
        return BindingBuilder.bind(messageQueue)
                .to(directExchange)
                .with(QUEUE_MESSAGE);
    }
}



application.yml

spring:
  application:
    name: springboot-rabbitmq-delay
  rabbitmq:
    host: 192.168.211.132
    port: 5672
    password: guest
    username: guest
/**
 * @ClassName HelloController
 * @Description TODO
 * @Author zengjx
 * @Company zengjx
 * @Date 2019/12/2  19:57
 * @Version V1.0
 */
@Component
public class MessageListener {

/****
 *  监听消息
 */
@RabbitListener(queues = QueueConfig.QUEUE_MESSAGE)
    public   void   msg(@Payload Object   msg){

    SimpleDateFormat  dateFormat =new SimpleDateFormat("yyyy-MM-dd: HH:mm:DD");
    System.out.println("当前时间:" + dateFormat.format(new Date()));
    System.out.println("收到信息:" + msg);

}
}
package com.message;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @ClassName HelloController
 * @Description TODO
 * @Author message
 * @Company message
 * @Date 2019/12/2  19:51
 * @Version V1.0
 */
@SpringBootApplication
@EnableRabbit
public class SpringRabbitMQApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringRabbitMQApplication.class);
    }


}
package com.test;

import com.message.SpringRabbitMQApplication;
import com.message.delay.QueueConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName HelloController
 * @Description TODO
 * @Author zengjx
 * @Company zengjx
 * @Date 2019/12/2  20:00
 * @Version V1.0
 */
@SpringBootTest(classes = SpringRabbitMQApplication.class)
@RunWith(value = SpringRunner.class)
public class RabbitMQTest {
    @Autowired
    private RabbitTemplate  rabbitTemplate  ;
    @Test
    public   void   test1() throws IOException {
        SimpleDateFormat  dateFormat  =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("发送当前时间"+dateFormat.format(new Date()));
        Map<String,String>  message =new HashMap<>();
        message.put("name","zengjx");
        rabbitTemplate.convertAndSend(QueueConfig.QUEUE_MESSAGE_DELAY, message, new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration("10000");
                return   message;
            }
        });
        System.out.println("等待输入......");
        System.in.read();

    }
    @Test
    public   void   test2(){

        rabbitTemplate.convertAndSend("exchange.order","queue.ordertest","1111");

    }

}

 

 

发布了221 篇原创文章 · 获赞 8 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/oDianZi1234567/article/details/103356813