rabbitmp的基础知识
RabbitMQ的安装
安装好RabbitMQ和Erlang后,在浏览器中输入:localhost:15672,进入rabbitmq的登陆界面, 登陆账号密码都是guest
创建交换机
创建队列
交换机与队列的绑定
消息推送、接收的流程
图片来源:https://blog.csdn.net/qq_35387940/article/details/100514134
交换机的四种类型
- Direct
直连型交换机,根据消息携带的路由键将消息投递给对应队列(点对点式) - Fanout
扇型交换机,这个交换机没有路由键概念,就算你绑了路由键也是无视的。 这个交换机在接收到消息后,会直接转发到绑定到它上面的所有队列。 - Topic
主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的。
*用来表示一个单词 (必须出现的)
#用来表示任意数量(零个或多个)单词 - Header 不常用,略
关于rabbitmq简单介绍完毕,下面开始整合RabbitMQ
整合RabbitMQ
引入Amqp依赖
<!-- RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
在application.properties中配置rabbitmq
#本机ip
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#默认端口,可以不写
spring.rabbitmq.port=5672
#虚拟主机也可以不写,默认"/"
#spring.rabbitmq.virtual-host=
测试 发送和接收消息
@Autowired
RabbitTemplate rabbitTemplate;
@Test
void send(){
User user = new User();
user.setId(1);
user.setUsername("root");
user.setPassword("root");
rabbitTemplate.convertAndSend("exchange.direct","world.news",user);
}
@Test
void receive(){
User user = (User)rabbitTemplate.receiveAndConvert("world.hh");
System.out.println(user);
}
定制序列化
package com.config;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyAMQPConfig {
/**
* RabbitMQ默认采用jdk序列化,我们可以定制序列化(以json形式)
* @return
*/
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
监听消息队列,要在springboot启动类上加上@EnableRabbit注解
/**
*监听消息队列
*/
@RabbitListener(queues = "world.hh")
public void listenerMsgQueues(User user){
System.out.println("收到消息:"+user);
}
@RabbitListener(queues = "world.news")
public void listenerMsgQueues2(Message message){
//获取消息内容,字节数组
System.out.println(message.getBody());
//获取消息的请求头
System.out.println(message.getMessageProperties());
}
使用AmqpAdmin创建交换机、队列及交换机与队列的绑定
@Autowired
AmqpAdmin amqpAdmin;
@Test
public void createExchange(){
amqpAdmin.declareExchange(new DirectExchange("myAmqp.direct"));
}
@Test
public void createQueue(){
amqpAdmin.declareQueue(new Queue("amqp.queue",true));
}
@Test
public void binding(){
amqpAdmin.declareBinding(new Binding("amqp.queue", Binding.DestinationType.QUEUE,"myAmqp.direct","amqp.hh",null));
}