近一年时间,老是在做小项目,消息队列都快忘记怎么用了,今天摸鱼的时候刚好看到一篇rabbitmq的入门教程,心血来潮的我马上梭一把。
docker安装rabbitmq
docker一把梭docker run -d -p 5672:5672 -p 15672:15672 rabbitmq 直接在本地虚拟机上部署。
springboot 集成 rabbitmq
在 start.spring.io/ 生成一个简单的依赖包压缩包
压缩包解压后,导入idea中,配置rabbitmq的连接信息
server.port=8081
spring.application.name=spring-boot-rabbitmq
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
#官方镜像 用户密码
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
启动Application,连接。
rabbitmq基础知识
队列queue需要与exchange绑定,客户端将消息发送到exchange中,根据exchange类型判断是否需要处理路由,在分配给对应的队列中。
exchange 类型
direct
处理路由键,将消息转发到完全匹配的队列中。
- 默认exchange
//设置队列
rabbitTemplate.setQueue('queue');
//发送信息,采用默认exchange时,消息会转发到与路由键相同的队列中(将队列与默认exchange绑定)
rabbitTemplate.convertAndSend('queue',msg);
...
//通过监听注解,就可以获取到队列中的消息
@RabbitListener(queues = "queue")
- 指定路由键
提前将队列与指定exchange绑定
Queue queue=new Queue("directqueue1");
DirectExchange directExchange=new DirectExchange("direct");
//绑定路由键
BindingBuilder.bind(queue).to(directExchange).with("myroutingkey");
rabbitTemplate.convertAndSend("direct", "myroutingkey", msg);
//通过监听注解,就可以获取到队列中的消息
@RabbitListener(queues = "directqueue1")
topic
跟上面direct模式差不多,不过topic模式可以模糊匹配路由键
提前将队列与指定exchange绑定
Queue queue=new Queue("topicqueue1");
TopicExchange topicExchange=new TopicExchange("mytopic");
//绑定路由键 *模糊模式代表一个或多个字符
BindingBuilder.bind(queue).to(topicExchange).with("*.myroutingkey.*");
rabbitTemplate.convertAndSend("mytopic", "test.myroutingkey.gg", msg);
//通过监听注解,就可以获取到队列中的消息
@RabbitListener(queues = "topicqueue1")
fanout
不需要处理路由键,将消息广播到所以绑定在该exchange上的队列
Queue queue=new Queue("fanoutqueue1");
FanoutExchange fanoutExchange=new FanoutExchange("fanout");
BindingBuilder.bind(queue).to(fanoutExchange)
rabbitTemplate.convertAndSend("fanout", "", msg);
//通过监听注解,就可以获取到队列中的消息
@RabbitListener(queues = "fanoutqueue1")
headers
不处理路由键,而是根据发送的消息内容中的headers属性进行匹配。
@Bean
public HeadersExchange headersExchange(){
return new HeadersExchange("headersExchange");
}
@Bean
public Queue headerQueue(){
return new Queue("headerQueue");
}
@Bean
public Binding binding3(){
//将键值队列绑定到 headersExchange 上
return BindingBuilder.bind(headerQueue()).to(headersExchange()).where("foo").matches("bar");
}
//发送消息
rabbitTemplate.convertAndSend("headersExchange","", msg, m -> {
m.getMessageProperties().getHeaders().put("foo", "bar");
return m;
});
//通过监听注解,就可以获取到队列中的消息
@RabbitListener(queues = "headerQueue")
小试牛刀
通过简单的测试案例,我又又重温rabbitmq 。接下来该好好巩固下mq的使用已经,基础知识了。