关于消息队列,市面上常见的有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 查看正在运行的容器
扫描二维码关注公众号,回复:
12676530 查看本文章
常见问题:
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