又又重温rabbitmq

115 阅读2分钟

近一年时间,老是在做小项目,消息队列都快忘记怎么用了,今天摸鱼的时候刚好看到一篇rabbitmq的入门教程,心血来潮的我马上梭一把。

docker安装rabbitmq

docker一把梭docker run -d -p 5672:5672 -p 15672:15672 rabbitmq 直接在本地虚拟机上部署。

springboot 集成 rabbitmq

start.spring.io/ 生成一个简单的依赖包压缩包

image.png 压缩包解压后,导入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的使用已经,基础知识了。