安装
使用docker安装,这里management是指定了具有管理界面(Management Interface)的版本,目前最新是3.11
docker pull rabbitmq:management
下载完镜像后可以查看一下
docker images
镜像列表出现rabbitmq
运行容器,不设置密码(默认guest),5672 用于AMQP (Advanced Message Queuing Protocol) 连接, 15672 用于管理界面(Management Interface),--hostname是设置的容器的主机名称,可以选择不加这个参数;--name是docker容器名称
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management
查看一下现有容器
docker ps -a
容器列表出现rabbit
访问宿主机的15672端口,能看到管理界面(如果用服务器,别忘了开安全组)
用户名和密码都是guest,登录进去就是这个界面
SpringBoot整合
需要新建两个springboot项目,一个用于生产者,一个用于消费者,均基于maven创建
在生产者rabbitmq-provider工程的pom.xml中,引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置application.yml,只要没有折腾过,virtual host就是/,至于怎么折腾可以去管理界面的admin里,笔者不做赘述
server:
port: 8021
spring:
#应用名字,当然也未必和文件夹名称一样
application:
name: rabbitmq-provider
#配置rabbitMq 服务器
rabbitmq:
host: xx.xx.xx.xx # 服务器ip
port: 5672 # 服务端口
username: guest #默认账号密码
password: guest
#虚拟host 一般情况下没有动过那个管理界面就没有virtual host,默认就是/
virtual-host: /
消费者工程的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
application.yml:换汤不换药
server:
port: 8022
spring:
application:
name: rabbitmq-consumer
#配置rabbitMq 服务器
rabbitmq:
host: 服务器ip
port: 5672
username: guest
password: guest
#虚拟host 可以不设置,使用server默认host
virtual-host: /
以直连方式为例:在rabbitmq-provider工程中新建配置类:
durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在
autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除
为了防止出现故障(断电等)导致消息丢失,一般要设置持久化
@Configuration
public class DirectRabbitConfig {
//队列
@Bean
public Queue TestDirectQueue() {
return new Queue("TestDirectQueue",true); // durable为true
}
//Direct交换机
@Bean
DirectExchange TestDirectExchange() {
return new DirectExchange("TestDirectExchange",true,false);
}
//绑定 将队列和交换机绑定, 并设置用于匹配的路由键:TestDirectRouting
@Bean
Binding bindingDirect() {
return BindingBuilder.bind(TestDirectQueue()).to(TestDirectExchange()).with("TestDirectRouting");
}
@Bean
DirectExchange lonelyDirectExchange() {
return new DirectExchange("lonelyDirectExchange");
}
}
创建一个controller,写一个发消息的接口(当然业务逻辑里未必是直接暴露接口进行调用,这里方便测试)
@RestController
public class MessageController {
@Autowired
RabbitTemplate rabbitTemplate; // 这里idea可能爆红,问题不大
@GetMapping("/sendDirectMessage")
public String sendDirectMessage() {
String messageId = String.valueOf(UUID.randomUUID());
String messageData = "test message, hello!";
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String,Object> map=new HashMap<>();
map.put("messageId",messageId);
map.put("messageData",messageData);
map.put("createTime",createTime);
//将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchange
rabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting", map);
return "ok";
}
}
在rabbitmq-consumer工程中创建监听类:
@Component
@RabbitListener(queues = "TestDirectQueue")//监听的队列名称 TestDirectQueue
public class DirectReceiver {
@RabbitHandler
public void process(Map testMessage) {
System.out.println("DirectReceiver消费者收到消息 : " + testMessage.toString());
}
}
先启动provider,然后用postman调用一下http://localhost:8021/sendDirectMessage接口(用浏览器也行,whatever),然后等一下,再启动consumer(不知道是什么问题,如果是直接启动两个工程,可能consumer会说找不到队列),然后可以发现consumer能够接收到这条消息了
感谢教程Springboot 整合RabbitMq ,用心看完这一篇就够了_springboot rabbitmq_小目标青年的博客-CSDN博客