RabbitMQ设置TTL(消息过期)时间(重要)
RabbitMQ设置消息过期时间
- 1、过期消息(死信)
- 2、设置消息过期的两种方式
- 2.1、设置单条消息的过期时间
- 2.1.1、配置文件application.yml
- 2.1.2、配置类RabbitConfig
- 2.1.3、发送消息业务类service(核心代码)
- 2.1.4、启动类
- 2.1.5、依赖文件pom.xml
- 2.1.6、测试
- 2.2、通过队列属性设置消息过期时间
- 2.2.1、配置文件application.yml
- 2.2.2、配置类RabbitConfig(核心代码)
- 2.2.3、发送消息业务类service
- 2.2.4、启动类
- 2.2.5、依赖文件pom.xml
- 2.2.6、测试
1、过期消息(死信)
过期消息也叫TTL消息,TTL:Time To Live
消息的过期时间有两种设置方式:设置单条消息的过期时间和通过队列属性设置消息过期时间
2、设置消息过期的两种方式
队列的过期时间决定了在没有任何消费者的情况下,队列中的消息可以存活多久;
注意事项:如果消息和对列都设置过期时间,则消息的TTL以两者之间较小的那个数值为准。
2.1、设置单条消息的过期时间
2.1.1、配置文件application.yml
server:
port: 8080
spring:
application:
name: ttl-test01
rabbitmq:
host: 你的服务器IP
port: 5672
username: 你这账号
password: 你的密码
virtual-host: power
my:
exchangeName: exchange.ttl.a
queueName: queue.ttl.a
2.1.2、配置类RabbitConfig
package com.power.config;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Value("${my.exchangeName}")
private String exchangeName;
@Value("${my.queueName}")
private String queueName;
//创建交换机
@Bean
public DirectExchange directExchange(){
return ExchangeBuilder.directExchange(exchangeName).build();
}
//创建队列
@Bean
public Queue queue(){
return QueueBuilder.durable(queueName).build();
}
@Bean
public Binding binding(DirectExchange exchangeName,Queue queueName){
return BindingBuilder.bind(queueName).to(exchangeName).with("info");
}
}
2.1.3、发送消息业务类service(核心代码)
package com.power.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
@Service
@Slf4j
public class MessageService {
@Resource
private RabbitTemplate rabbitTemplate;
@Bean
public void sendMsg(){
//设置消息过期的核心代码
MessageProperties messageProperties = new MessageProperties();
messageProperties.setExpiration("30000");//设置消息过期时间
Message message = MessageBuilder.withBody("hello world".getBytes()).andProperties(messageProperties).build();
rabbitTemplate.convertAndSend("exchange.ttl.a","info",message);
log.info("消息发送完毕,发送时间是:"+new Date());
}
}
2.1.4、启动类
package com.power;
import com.power.service.MessageService;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.Resource;
@SpringBootApplication
public class Application implements ApplicationRunner {
@Resource
private MessageService messageService;
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
@Override
public void run(ApplicationArguments args) throws Exception {
messageService.sendMsg();
}
}
2.1.5、依赖文件pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.power</groupId>
<artifactId>rabbit_05_ttl01</artifactId>
<version>1.0-SNAPSHOT</version>
<name>rabbit_05_ttl01</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.1.6、测试
启动项目:
登录rabbitmq后台:
在消息有效期内,可以获取到消息。
超过消息有效期,获取不到消息。
2.2、通过队列属性设置消息过期时间
2.2.1、配置文件application.yml
server:
port: 8080
spring:
application:
name: ttl-test02
rabbitmq:
host: 你的服务器IP
port: 5672
username: 你这账号
password: 你的密码
virtual-host: power
my:
exchangeName: exchange.ttl.b
queueName: queue.ttl.b
2.2.2、配置类RabbitConfig(核心代码)
package com.power.config;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class RabbitConfig {
@Value("${my.exchangeName}")
private String exchangeName;
@Value("${my.queueName}")
private String queueName;
//创建交换机
@Bean
public DirectExchange directExchange(){
return ExchangeBuilder.directExchange(exchangeName).build();
}
//创建队列
@Bean
public Queue queue(){
//设置队列消息的过期时间,超过这个有效期,队列内的所有消息都会过期
//方式1:new Queue的方式
Map<String, Object> arguments = new HashMap<>();
arguments.put("x-message-ttl",30000);
return new Queue(queueName,true,false,false,arguments);
// 方式2:建造者方式
// return QueueBuilder.durable(queueName).withArguments(arguments).build();
}
@Bean
public Binding binding(DirectExchange exchangeName,Queue queueName){
return BindingBuilder.bind(queueName).to(exchangeName).with("info");
}
}
2.2.3、发送消息业务类service
package com.power.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
@Service
@Slf4j
public class MessageService {
@Resource
private RabbitTemplate rabbitTemplate;
@Bean
public void sendMsg(){
Message message = MessageBuilder.withBody("hello world".getBytes()).build();
rabbitTemplate.convertAndSend("exchange.ttl.b","info",message);
log.info("消息发送完毕,发送时间是:"+new Date());
}
}
2.2.4、启动类
package com.power;
import com.power.service.MessageService;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.Resource;
@SpringBootApplication
public class Application implements ApplicationRunner {
@Resource
private MessageService messageService;
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
@Override
public void run(ApplicationArguments args) throws Exception {
messageService.sendMsg();
}
}
2.2.5、依赖文件pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.power</groupId>
<artifactId>rabbit_05_ttl02</artifactId>
<version>1.0-SNAPSHOT</version>
<name>rabbit_05_ttl02</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2.6、测试
启动项目:
登录后台查看