AMQP
AMQP(Advanced Message Queuing Protocol,高级消息队列协议)
是进程之间传递异步消息的网络协议。
AMQP工作过程
发布者(Publisher)发布消息(Message),经过交换机(Exchange),交换机根据路由规则将收到消息分发给交换机绑定的队列(Queue),最后AMQP代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。
RabbitMQ介绍
RabbitMQ是由Erlang语言编写的基于AMQP的消息中间件。而消息中间件作为分布式系统重要组件之一,可以解决应用耦合,异步消息,流量削峰等问题。
原理
direct交换器是RabbitMQ默认交换器。默认会进行公平调度。所有接受者依次从消息队列中获取值。Publisher给哪个队列发消息,就一定是给哪个队列发送消息。对交换器绑定的其他队列没有任何影响。
AmqpTemplate:操作RabbitMQ的接口。负责发送或接收消息
@RabbitListener(queues = "") 注解某个方法为接收消息方法
发送消息
@Autowired
private AmqpTemplate amqpTemplate;
@Test
public void test(){
amqpTemplate.convertAndSend("myqueue","这是内容1");
System.out.println("发送成功");
}
接收消息
@Component
public class DemoReceive {
@RabbitListener(queues = "myqueue")
public void demo(String msg){
System.out.println("获取到的消息1111:"+msg);
}
@RabbitListener(queues = "myqueue")
public void demo2(String msg){
System.out.println("获取到的消息2222:"+msg);
}
}
扇形交换器,实际上做的事情就是广播,fanout会把消息发送给所有的绑定在当前交换器上的队列。且每个队列消息中第一个Consumer能收到消息。
FanoutExchange:fanout交换器
Binding:绑定交换器和队列
BindingBuilder:Binding的构建器
amq.fanout:内置fanout交换器名称
配置
@Bean
protected Queue fanoutQuque1(){
return new Queue("fanout1");
}
@Bean
protected Queue fanoutQuque2(){
return new Queue("fanout2");
}
@Bean
protected FanoutExchange fanoutExchange(){
return new FanoutExchange("amq.fanout");
}
@Bean
protected Binding fanoutBinding(Queue fanoutQuque1,FanoutExchange fanoutExchange){
return BindingBuilder.bind(fanoutQuque1).to(fanoutExchange);
}
@Bean
protected Binding fanoutBinding2(Queue fanoutQuque2,FanoutExchange fanoutExchange){
return BindingBuilder.bind(fanoutQuque2).to(fanoutExchange);
}
发送消息
第二个参数routingKey对于fanout没有意义的
@Test
public void test2(){
amqpTemplate.convertAndSend("amq.fanout","asdfadsf","fanout msg");
System.out.println("发送成功");
}
接收消息同direct
允许在路由键(RoutingKey)中出现匹配规则。
路由键的写法和包写法相同。com.msb.xxxx.xxx格式。
在绑定时可以带有下面特殊符号,中间可以出现:
* : 代表一个单词(两个.之间内容)
# : 0个或多个字符
接收方依然是公平调度,同一个队列中内容轮换获取值。
TopicExchange:Topic交换器
amq.topic:内置topic交换器名称
配置
@Bean
protected Queue topicQueue() {
return new Queue("topic1");
}
@Bean
protected Queue topicQueue2() {
return new Queue("topic2");
}
@Bean
protected TopicExchange topicExchange() {
return new TopicExchange("amq.topic");
}
@Bean
protected Binding topicBinding(Queue topicQueue, TopicExchange topicExchange) {
return BindingBuilder.bind(topicQueue).to(topicExchange).with("com.a");
}
@Bean
protected Binding topicBinding2(Queue topicQueue2, TopicExchange topicExchange) {
return BindingBuilder.bind(topicQueue2).to(topicExchange).with("com.#");
}
发送消息
第二个参数为路由键,匹配配置类中绑定时的路由规则。
@Test
public void test3(){
amqpTemplate.convertAndSend("amq.topic","com.bjsxt.a.b","topic msg");
System.out.println("发送成功");
}