关于消息队列,市面上常见的有Activemq,rabbimq,kafka,rocketmq,关于性能对比,使用场景等,网上类似的文章有非常多,这里不重复陈述,开此贴是为了记录一下自己的使用。
1.rabbitmq环境的构建。
笔者直接使用docker,创建的rabbitmq容器。
关于Windows10安装docker,没有特别需要描述的,坑一定是有的。常见的问题如下:
a.如果您使用的是Windows10 家庭版,请注意Hype-v是否能正常开启,虚拟化是否能正常开启。
b.WSL2 installation is incomplete 报错,如果您使用的版本docker 19.03.13附近的版本,比较高的概率遇到这个提示,下载安装wsl_update_x64.msi 即可。
c.拉取镜像缓慢,需要更换国内源,搜索docker国内源即可,这里使用的阿里源:
https://pee6w651.mirror.aliyuncs.com

ok,正常按照提示,安装完docker重启后,可以安装rabbitmq了
a. 执行docker search rabbitMq搜索镜像
b. 执行docker pull rabbitMq:3.8.3-management 拉取3.8.3-management版本(带有web页面的)的rabbitMq镜像
c. 执行docker images查看所有镜像
d. 执行docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:3.8.3-management
e. 执行docker ps 查看正在运行的容器
常见问题:
a.在重启后,如果无法挂载5672端口,记得杀一下端口,可能会提示冲突。
b.容器正常启动,无法访问 web->http://localhost:15672/ 应用->5672 注意启动命令中是否指定了这俩接口。
c. docker命令解析 docker run xxx 启动容器 -d 是后台启动,即关掉shell不会终止. -p 或者 -publish 是指定端口。
--name 指定容器名称 不支持特殊符号
2.Springboot使用rabbit mq
消费者的配置:
1.构建Springboot项目导入依赖:
| 1 2 3 4 | <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> |
2.Rabbit配置类,生成交换机,队列,以及匹配规则:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | @Configuration public class RabbitConfig { //1.定义三个交换机 @Bean public DirectExchange directExchange(){ return new DirectExchange("DIRECT_EXCHANGE"); } @Bean public TopicExchange topicExchange(){ return new TopicExchange("TOPIC_EXCHANGE"); } @Bean public FanoutExchange fanoutExchange(){ return new FanoutExchange("FANOUT_EXCHANGE"); } //2.定义四个队列 @Bean public Queue firstQueue(){ return new Queue("FIRST_QUEUE"); } @Bean public Queue secondQueue(){ return new Queue("SECOND_DQUEUE"); } @Bean public Queue thirdQueue(){ return new Queue("THIRD_DQUEUE"); } @Bean public Queue fourthQueue(){ return new Queue("FOURTH_DQUEUE"); } //3.定义四个绑定关系 @Bean public Binding bindFirst(@Qualifier("firstQueue") Queue queue, @Qualifier("directExchange") DirectExchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("wuzz.test"); } @Bean public Binding bindSecond(@Qualifier("secondQueue") Queue queue, @Qualifier("topicExchange") TopicExchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("*.wuzz.*"); } @Bean public Binding bindThird(@Qualifier("thirdQueue") Queue queue, @Qualifier("fanoutExchange") FanoutExchange exchange){ return BindingBuilder.bind(queue).to(exchange); } @Bean public Binding bindFourth(@Qualifier("fourthQueue") Queue queue, @Qualifier("fanoutExchange") FanoutExchange exchange){ return BindingBuilder.bind(queue).to(exchange); } } |
3.定义4个消费者:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | @Configuration @RabbitListener(queues = "FIRST_QUEUE") public class FirstConsumer { @RabbitHandler public void process(String msg){ System.out.println("First Queue received msg : " + msg); } } @Configuration @RabbitListener(queues = "SECOND_DQUEUE") public class SecondConsumer { @RabbitHandler public void process(String msg){ System.out.println("second Queue received msg : " + msg); } } @Configuration @RabbitListener(queues = "THIRD_DQUEUE") public class ThirdConsumer { @RabbitHandler public void process(String msg){ System.out.println("third Queue received msg : " + msg); } } @Configuration @RabbitListener(queues = "FOURTH_DQUEUE") public class FourthConsumer { @RabbitHandler public void process(String msg){ System.out.println("fourth Queue received msg : " + msg); } } |
4.配置application.properties,定义链接地址等信息:
| application-dev.yml | spring appliacition name:test rabbitmq:
host: 127.0.0.1 # 这里如果写localhost 会有问题
username: guest # 默认名称
password: guest # 默认密码
port: 5672 # 默认应用访问端口,注意 一般默认使用15672 做web访问接口,取决于你的命令绑定。
|
启动消费者,可以通过管理页面看到有4个链接通道及交换机队列信息。
生产者:
1.构建SpringBoot项目导入依赖
| 1 2 3 4 | <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> |
2.通过 RabbitTemplate 构建自己的生产者类,发送4条消息:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Component public class MyProducer { @Autowired private RabbitTemplate rabbitTemplate; public void send(){ rabbitTemplate.convertAndSend("DIRECT_EXCHANGE","martin.test","DIRECT_EXCHANGE message"); rabbitTemplate.convertAndSend("TOPIC_EXCHANGE","hello.martin.test","TOPIC_EXCHANGE hello message"); rabbitTemplate.convertAndSend("TOPIC_EXCHANGE","he.martin.test","TOPIC_EXCHANGE hi message"); rabbitTemplate.convertAndSend("FANOUT_EXCHANGE","","FANOUT_EXCHANGE message"); } } |
3.编写测试类测试,并且启动:
| 1 2 3 4 5 6 7 8 9 10 11 12 | @RunWith(SpringRunner.class) @SpringBootTest public class AppTest { @Autowired private MyProducer myProducer; @Test public void send(){ myProducer.send(); } } |
end