首先,需要在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
然后,在application.properties文件中配置RabbitMQ连接信息:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
接下来,定义一个消息发送者和一个消息接收者,分别用于发送和接收消息:
javaCopy code
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MessageSender {
@Autowired
private AmqpTemplate amqpTemplate;
public void send(String message) {
amqpTemplate.convertAndSend("member.exchange", "member.key", message);
}
}
javaCopy code
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class MessageReceiver {
@RabbitListener(queues = "member.queue")
public void receive(Message message) {
String expiredMessage = new String(message.getBody());
System.out.println("Expired member: " + expiredMessage);
}
@RabbitListener(queues = "member.dead.queue")
public void receiveDeadLetter(Message message) {
String expiredMessage = new String(message.getBody());
System.out.println("Dead letter expired member: " + expiredMessage);
}
}
在发送消息时,需要将消息发送到名为"member.exchange"的交换机,使用名为"member.key"的路由键将消息路由到名为"member.queue"的队列。在接收消息时,需要使用@RabbitListener注解监听"member.queue"队列和"member.dead.queue"队列。
最后,需要在启动类中声明交换机、队列和绑定关系,并设置死信队列:
javaCopy code
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
RabbitAdmin rabbitAdmin = context.getBean(RabbitAdmin.class);
DirectExchange exchange = new DirectExchange("member.exchange");
rabbitAdmin.declareExchange(exchange);
Queue queue = new Queue("member.queue");
rabbitAdmin.declareQueue(queue);
Queue deadQueue = new Queue("member.dead.queue");
rabbitAdmin.declareQueue(deadQueue);
Binding binding = BindingBuilder.bind(queue).to(exchange).with("member.key");
rabbitAdmin.declareBinding(binding);
Queue dlq = QueueBuilder.durable("member.queue.dead")
.withArgument("x-dead-letter-exchange", "")
.withArgument("x-dead-letter-routing-key", "member.dead.queue")
.build();
rabbitAdmin.declareQueue(dlq);
}
}
在这个代码中,我们创建了一个Direct类型的交换机,一个会员到期队列和一个会员到期死信队列。使用BindingBuilder将会员到期队列绑定到交换机上,并设置
在应用程序中,您可以注入MessageSender bean并调用其send方法,向队列发送消息。例如:
javaCopy code
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private MessageSender messageSender;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) throws Exception {
// 发送会员到期消息
String message = "member_id_123";
messageSender.send(message);
}
}
在上面的代码中,我们实现了Spring Boot的CommandLineRunner接口,在应用程序启动后自动执行run方法。在run方法中,我们调用了MessageSender的send方法,向队列发送会员到期消息。当队列中的消息过期时,将会被发送到死信队列中。
设置消息到期时间
要设置消息到期时间,可以在发送消息时将过期时间设置为消息属性。下面是一个示例代码:
javaCopy code
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MessageSender {
@Autowired
private AmqpTemplate amqpTemplate;
public void send(String message, long expiration) {
MessageProperties messageProperties = new MessageProperties();
messageProperties.setExpiration(Long.toString(expiration));
Message amqpMessage = new Message(message.getBytes(), messageProperties);
amqpTemplate.send("member.exchange", "member.key", amqpMessage);
}
}
在上面的代码中,我们定义了一个send方法,该方法接受一个message参数和一个expiration参数,expiration参数表示消息的过期时间(毫秒)。我们创建了一个MessageProperties对象,并将过期时间设置为消息属性。然后,我们使用Message类创建一个AMQP消息,并调用AmqpTemplate的send方法发送消息。
在发送消息时,可以使用如下代码:
javaCopy code
// 发送会员到期消息,过期时间为1小时
long expiration = 3600 * 1000L;
messageSender.send("member_id_123", expiration);
这将会发送一条会员到期消息,并将过期时间设置为1小时。当消息过期时,将被发送到死信队列中。