Springboot + rabbitMq队列
1.linux上直接拉个mq镜像,直接启动,设置了镜像名my-rabbitmq, 设置端口映射出去,设置账号和密码为admin
docker run -d --name my-rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3
2.开启可视化界面
先进入容器内部
docker exec -it my-rabbitmq bash
然后启动界面
rabbitmq-plugins enable rabbitmq_management
访问:地址:15672 登录即可。
3.springboot中使用
安装依赖
<!-- rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置文件
spring:
rabbitmq:
host: 192.168.17.13 # RabbitMQ服务器地址
port: 5672 # RabbitMQ服务器端口
username: admin # 默认用户名
password: admin # 默认密码
virtual-host: / # 虚拟主机
写配置类:
@Configuration
public class RabbitMQConfig {
// 定义队列
@Bean
public Queue queue() {
return new Queue("myQueue", true);
}
//可以定义多个队列
// 定义第二个队列
@Bean
public Queue queue2() {
return new Queue("myQueue2", true);
}
// 定义第三个队列
@Bean
public Queue queue3() {
return new Queue("myQueue3", true);
}
// 定义交换机
@Bean
public TopicExchange exchange() {
return new TopicExchange("myExchange");
}
// 绑定队列和交换机
@Bean
public Binding binding(Queue queue, TopicExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("myRoutingKey");
}
// 绑定队列和交换机队列2的
@Bean
public Binding bindingQueue2(Queue queue2, TopicExchange exchange) {
return BindingBuilder.bind(queue2).to(exchange).with("myRoutingKey2");
}
}
定义队列
@Bean
public Queue queue() {
return new Queue("myQueue", true);
}
- 第一个参数
"myQueue"
是队列的名称,这是一个自定义的标识符,用于唯一标识这个队列。 - 第二个参数
true
表示这个队列是持久化的,即在RabbitMQ服务器重启后,队列依然存在,不会丢失数据。
定义交换机
@Bean
public TopicExchange exchange() {
return new TopicExchange("myExchange");
}
创建一个名为myExchange
的主题交换机(Topic Exchange)实例。
TopicExchange
是一种交换机类型,它使用主题(Topic)进行消息路由。生产者发送消息时,可以指定一个路由键,消费者可以根据自己的需求订阅匹配特定模式的消息。- 交换机名称
"myExchange"
是自定义的,用于标识这个交换机。
绑定队列和交换机
@Bean
public Binding binding(Queue queue, TopicExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("myRoutingKey");
}
这个方法创建了一个绑定实例,它定义了如何将队列绑定到交换机,并指定了路由键。
BindingBuilder
是RabbitMQ提供的一个工具类,用于构建绑定关系。bind(queue)
方法指定了要绑定的队列。to(exchange)
方法指定了要绑定到的交换机。with("myRoutingKey")
方法指定了路由键。在这个例子中,所有的路由键都是"myRoutingKey"
。这意味着只有当消息的路由键是"myRoutingKey"
时,交换机才会将消息路由到这个队列。
配置完了,现在去写生产者代码,也就是发消息到mq上的代码
convertAndSend方法要把刚配置类的交换机和路由键填上。
@Component
public class MessageSender {
private final RabbitTemplate rabbitTemplate;
@Autowired
public MessageSender(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
public void send(String message) {
rabbitTemplate.convertAndSend("myExchange", "myRoutingKey", message);
}
}
现在写消费者代码,也就是接收到消息后的处理
指定监控哪个队列,然后获取的信息打印出来,或者做其它处理。
@Component
public class MessageReceiver {
@RabbitListener(queues = "myQueue")
public void receive(String message) {
System.out.println("Received message: " + message);
}
}