前提
上周我们的项目经理破天荒的要求我把原来的项目升级下,使用消息队列处理订单,不再是在处理订单的所有逻辑都串行起来,听到这一消息,我马上紧张起来,以前一直都是串行处理的,怎么现在要用mq了,而且mq我还没用过,赶紧搜索资料学习起来,于是乎就有了这篇文章。
rabbitmq
在众多的消息队列中间件中,我选择了rabbitmq进行学习,一是由于他安装起来方便,二是有官方的spring starter,由于我初次的使用。
首先我选择了带web管理端的镜像,docker pull rabbitmq:management,
镜像拉取完后,docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management,其中端口15672为web的暴露端口。访问http://localhost:15672,username&password 为guest。
rabbitmq starer
将rabbitmq整合到spring boot中,添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
application.yml中配置
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
virtualHost: /
RabbitmqConfig
@Configuration
public class RabbitmqConfig {
// 声明交换机和队列
public static final String QUEUE_HELLO = "queue_hello";
public static final String EXCHANGE_HELLO = "exchange_hello";
// 声明工作模式的交换机
@Bean(EXCHANGE_HELLO)
public Exchange EXCHANGE_TOPICS() {
// durable(true) 表面重启之后交换机还在
return ExchangeBuilder.directExchange(EXCHANGE_HELLO).build();
}
// 声明QUEUE_HELLO队列
@Bean(QUEUE_HELLO)
public Queue QUEUE() {
return new Queue(QUEUE_HELLO);
}
// 交换机与QUEUE_HELLO队列绑定
@Bean
public Binding BINDING_QUEUE(Queue queue, DirectExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).withQueueName();
}
}
ReceiveHandler 监听器
@Component
public class ReceiveHandler {
// 监听队列
@RabbitListener(queues = {RabbitmqConfig.QUEUE_HELLO})
public void receiveMsg(String msg, Message message, Channel channel){
System.out.println(msg);
}
}
来到web端进行消息的发送。点击queues,进去我们刚刚创建的队列中。
找到publish message ,在properties中填写 content-type=text/plain ,payload填写要发送到队列中的内容。
切回到idea中,我们能查看到刚刚在web端往队列里面发送的内容了。
通过java代码发送消息。
启动测试用例,就可以看到往队列发送的消息了。
rabbitmq 交换机
rabbitmq中的基本逻辑。
exchange与queue之间存在四种关系。
- fanout fanout-exchange模式,将消息推送到所有与之绑定的queue中;
- direct direct-exchange模式,将消息推送到与之绑定的queue中,且RoutingKey完全匹配。(默认模式)
- topic topic-exchange模式,与direct-exchange模式相识,不过RoutingKey做模糊匹配。
- headers headers-exchange模式,根据headers来分发消息。
以上就是rabbitmq在spring boot的基础使用了。