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");
}
}