先贴个链接:
demo在这:https://www.cnblogs.com/boshen-hzb/p/6841982.html
这里重点只是解释下步骤和一些类的区别
下面是Rabbit MQ的原理图,
可以发先,所有的消息都是先经由 Exchange (交换器)进行转发到 Queue(队列)中,然后消费者会从Queue中取出数据,消息就是存储到 队列 中的。
有百度搜的,有个人理解。自己做笔记使用
Queue的介绍
/**
* 创建一个队列
* @return
*/
@Bean
public Queue helloQueue() {
return new Queue("hello");
}
//此处的Queue是可以做其他配置的
源码是这样的
public Queue(String name) {
this(name, true, false, false);
}
还有一个构造器是这样的
public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
Assert.notNull(name, "'name' cannot be null");
this.name = name; //名称
this.durable = durable; //是否持久化
this.exclusive = exclusive; //是否排外(多个链接访问时,只能有一个进来)
this.autoDelete = autoDelete; //是否自动删除
this.arguments = arguments; //这个。。默认为null 具体是啥。我也不知道
}
Exchange 交换器的介绍
Rabbit MQ中有四种交换器 fanout,direct,topic,header(使用较少)
(一)DirectExchange
/**
*
* 1默认的Exchage,该Exchage的名字为空字符串,
* 2这种模式下不需要将Exchage进行任何的绑定(binding)操作
* 3消息传递时需要一个“RouteKey”,可以简单的理解为要发送的队列的名字。
* 4如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。
*/
@Bean
public DirectExchange directExchange(){
return new DirectExchange("directExchange");
}
(二)FanoutExchange
/**
* 任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。
* Fanout Exchange 任何发送到 FanoutExchange的消息都会被转发到与该路由绑定的所有queue上
* 1可以理解为路由表的模式
* 2这种模式不需要RouteKey (这是个什么鬼。)
* 3这种模式需要提前将Exchange与Queue进行绑定,一个交换机可以绑定多个queue,一个Queue可以与多个Exchange进行绑定
* 4如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃
*/
@Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange("fanoutExchange");
}
(三)TopicExchange
/**
*
* 任何发送到TopicExchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上
* 1这种模式比较复杂,简单的说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列
* 2这种模式需要RouteKey,也许要提前绑定Exchange与Queue.
* 3在进行绑定时,要提供一个该队列关心的主题 ,如“#.log.#”标识该队列关心所有涉及log的消息(一个RouteKey为“MQ.log.error”的消息会被转发到该队列)。
* 4“#”标识0个或若干个关键字,“*”表示一个关键字,如“log.*”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
* 5.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息
*/
@Bean
public TopicExchange exchange() {
return new TopicExchange("topicExchange");
}
而 在开头的Demo中, 是这样发送消息的
/**
* 他们说这是一个生产者
* @author Administrator
*/
@Component
public class HelloSender1 {
//注入一个mq模板对象
@Autowired
private AmqpTemplate amqpTemplate;
public void send() {
String sendMsg = "hello1 " + new Date();
System.out.println("Sender1 : " + sendMsg);
//此处的"hello"是一个队列,将这个消息发送到hello队列中
amqpTemplate.convertAndSend("hello", sendMsg);
}
}
看起来是直接发送到了Queue中 其实 是发送到了 一个默认 的交换器上。后转发到Queue 中的。
https://www.jianshu.com/p/2c5eebfd0e95