RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue Protocol)的开源实现
Message
消息,由消息头和消息体组成。
消息头则是由一系列的可选属性组成:
①routing-key(路由键)
②priority:相对于其他消息的优先权
③delivery-mode:指出该消息可能需要持久性存储
消息体是不透明的。
Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序
Exchange
交换器,用于接收生产者发送的消息并将这些消息路由给服务器中的队列。
Exchange有4种类型:
①direct:默认
②fanout
③topic
④headers
Queue
消息队列。用于保存消息直到发送给消费者。
Binding
绑定,用于消息队列和交换器之间的关联。
Exchange和Queue的绑定可以是多对多的关系。
Connection
网络连接,比如一个TCP连接
Channel
信道,多路复用连接中的一个独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP命令都是通过信道发出的,不管是发布消息、订阅队列、还是接收消息,这些动作都是通过信道完成的。
Consumer
消息的消费者,表示从一个消息队列中取得消息的客户端应用程序。
生产者(producer)生产消息(message),发送给服务器(broker),然后服务器将消息交给交换器(exchage),交换器根据消息中的消息头所携带的路由键(routing-key)的绑定规则(binding),将其交给对应的消息队列(queue),最后消费者(consumer)从消息队列中取出消息进行消费。
我们将使用docker在Linux虚拟机上安装RabbitMQ。
1、下载(下载带管理界面的版本)
docker pull docker.io/rabbitmq:3-management
2、启动RabbitMQ
docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq 6a98e7057e36
org.springframework.boot
spring-boot-starter-amqp
spring.rabbitmq.host=192.168.199.220
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.port=5672
@EnableRabbit
@SpringBootApplication
public class SpringbootRabbitmqApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootRabbitmqApplication.class, args);
}
}
@Configuration
public class MyAMQPConfig {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
@SpringBootTest
class SpringbootRabbitmqApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
AmqpAdmin amqpAdmin;
@Test
public void createExchange(){
Exchange exchange = new DirectExchange("amqpadmin.exchange");
amqpAdmin.declareExchange(exchange);
System.out.println("创建完成");
}
@Test
public void createBinding(){
Binding binding = new Binding("amqpadmin.queue", Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqp.haha",null);
amqpAdmin.declareBinding(binding);
System.out.println("binding成功");
}
@Test
public void createQueue(){
amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
System.out.println("queue创建完成");
}
/**
* 1、单播(点对点)
*/
@Test
void contextLoads() {
//rabbitTemplate.send(exchange,routeKey,message);
//object默认当成消息体,只需要传入要发送的对象,自动序列化发送给rabbitmq
//rabbitTemplate.convertAndSend(exchange,routeKey,object);
Map map = new HashMap<>();
map.put("msg","first message");
map.put("data",Arrays.asList("hello","world",123,true));
// rabbitTemplate.convertAndSend("exchange.dirct","atguigu.news",map);
rabbitTemplate.convertAndSend("exchange.dirct","atguigu.news",new Student("彭大大","男"));
}
@Test
public void receive(){
Object o = rabbitTemplate.receiveAndConvert("atguigu.news");
System.out.println(o.getClass());
System.out.println(o);
}
/**
* 广播
*/
@Test
public void sendMsg(){
rabbitTemplate.convertAndSend("exchange.fanout","",new Student("彭小小","女"));
}
}
相关代码已上传到git上:https://github.com/pengyufenga/springboot_study.git