关于消息队列,市面上常见的有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