1.什么是RabbitMQ
RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。
RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展
性、高可用性等方面表现不俗
RabbitMQ有三大模式
第一步:在你的pom.xml导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
第二步:在application.yml添加配置文件(注意层次和空格)
spring:
rabbitmq:
host: 127.0.0.1
直接模式(Direct)
应用场景:我们需要将消息发给唯一一个节点时使用这种模式,这是最简单的一种形式。
任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1.一般情况可以使用rabbitMQ自带的Exchange(交换器):”"(该Exchange的名字为空字符串,下
文称其为default Exchange)。
2.这种模式下不需要将Exchange进行任何绑定(binding)操作
3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。
发送者
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* @Description: 直接模式
* @Param: [msg] ce 是你的队列名称
* @return: void
* @Author:
* @Date: 2018/12/3
*/
@Test
public void sendMsg() {
rabbitTemplate.convertAndSend("ce", "测试直接模式");
}
消费者
@Component
@RabbitListener(queues = "ce") #你要监听的队列
public class Customer1 {
@RabbitHandler
public void getMsg(String msg) {
System.out.println("消息内容:" + msg); #获取到消息内容
}
}
分列模式(Fanout)
应用场景:当我们需要将消息一次发给多个队列时,需要使用这种模式
任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有
Queue上。
1.可以理解为路由表的模式
2.这种模式不需要RouteKey
3.这种模式需要提前将Exchange(交换器)与Queue(队列)进行绑定,一个Exchange可以绑定多个
Queue,一个Queue可以同多个Exchange进行绑定。
4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。
事先去新建两个队列和一个交换机
在queue中添加队列first和second
新建交换器interchanger
将first和second两个队列绑定到交换器
发送者
@Test
public void sendMsg1() {
rabbitTemplate.convertAndSend("interchanger", "", "分裂模式");
}
消费者first和消费者second
@Component
@RabbitListener(queues = "first")
public class Customer2 {
@RabbitHandler
public void getMsg(String msg) {
System.out.println("消费内容:" + msg);
}
}
@Component
@RabbitListener(queues = "second")
public class Customer3 {
@RabbitHandler
public void getMsg(String msg) {
System.out.println("消费内容:" + msg);
}
}
主题模式
应用场景:任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上
简单来说就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的
队列
符号 # 匹配一个或多个词,符号 * 匹配一个词
比如
java.*c就可以匹配到java.cc、java.ac但不能匹配到java.ccc
java.#c就可以匹配到java.ccc、javac
新建一个交换机top添加匹配规则如下:top.good.#
发送方
@Test
public void sendMsg2() {
rabbitTemplate.convertAndSend("top", "top.good.java", "主题模式");
}
消费方
@Test
public void testSendTopic2(){
rabbitTemplate.convertAndSend("top","top.goo","主题模式");
}
结果会显示
sendMsg2方法获取到数据
testSendTopic2方法没有获取到数据