共计 2519 个字符,预计需要花费 7 分钟才能阅读完成。
Default Exchange(默认交换机)
在首先创立一个 Queen 之后,RabbitMQ 会把这个 Queen 间接绑定到默认交换机上,并且应用 Queen 的名字作为 Routing Key。
因而,对外体现的成果就是,客户端向这个 Queen 间接投递音讯,严格匹配。
// TODO 此处应该有代码
Direct exchange(直连交换机)
和 Default Exchange 相似,但灵便度更高,基于 AMQP 协定,能够由 Producer 或 Consumer 进行指定,伪代码如下:
// 实现 BeanPostProcessor 类,应用 Bean 的生命周期函数
@Component
public class DirectRabbitConfig implements BeanPostProcessor {
// 这是创立交换机和队列用的 RabbitAdmin 对象
@Resource
private RabbitAdmin rabbitAdmin;
// 初始化 RabbitAdmin Bean
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
// 只有设置为 true,spring 才会加载 RabbitAdmin 这个类
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
// 实例化 bean 后,也就是 Bean 的后置处理器
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 向 RabbitMQ 申明创立 Exchange
rabbitAdmin.declareExchange(rabbitmqDemoDirectExchange());
// 向 RabbitMQ 申明创立 Queen
rabbitAdmin.declareQueue(rabbitmqDemoDirectQueue());
return null;
}
/**
* 申明一个 Queen Bean, 用于下面这个办法
*/
@Bean
public Queue rabbitmqDemoDirectQueue() {
/**
* 1、name: 队列名称
* 2、durable: 是否长久化
* 3、exclusive: 是否独享、排外的。如果设置为 true,定义为排他队列。则只有创建者能够应用此队列。也就是 private 公有的。* 4、autoDelete: 是否主动删除。也就是长期队列。当最初一个消费者断开连接后,会主动删除。* */
return new Queue(RabbitMQConfig.RABBITMQ_DEMO_TOPIC, true, false, false);
}
/**
* 申明一个 DirectExchange Bean, 用于下面的下面这个办法
*/
@Bean
public DirectExchange rabbitmqDemoDirectExchange() {
//Direct 交换机
return new DirectExchange(RabbitMQConfig.RABBITMQ_DEMO_DIRECT_EXCHANGE, true, false);
}
/**
* 申明一个 Binding Bean, 用于把 Queen 和 Exchange 进行绑定
* 并设置 RabbitMQConfig.RABBITMQ_DEMO_DIRECT_ROUTING 作为 Routing Key
* 投递音讯的时候能够应用这个 key 通过这个 Exchange 发送到这个 Queen 上
*/
@Bean
public Binding bindDirect() {
// 链式写法,绑定交换机和队列,并设置匹配键
return BindingBuilder
// 绑定队列
.bind(rabbitmqDemoDirectQueue())
// 到交换机
.to(rabbitmqDemoDirectExchange())
// 并设置匹配键
.with(RabbitMQConfig.RABBITMQ_DEMO_DIRECT_ROUTING);
}
}
Fanout exchange(扇形交换机)
无需依附 Routing Key,所有绑定到这种 Exchange 上的 Queen 都会收到投递,因而适宜播送音讯:
- 大规模多用户在线(MMO)游戏能够应用它来解决排行榜更新等全局事件
- 体育新闻网站能够用它来近乎实时地将比分更新分发给挪动客户端
- 散发零碎应用它来播送各种状态和配置更新
-
在群聊的时候,它被用来散发音讯给参加群聊的用户。(AMQP 没有内置 presence 的概念,因而 XMPP 可能会是个更好的抉择)
// TODO 此处应该有配置 Bean 的代码和 Producer 的发送 demo
Topic Exchange(主题交换机)
Routing Key 反对单词匹配和全含糊匹配,缺德的中央在于 匹配两点之间的内容,而 # 匹配所有,如 routing..user 只能匹配 routing.biz.user、routing.user.user、routing.car.user,而 routing.#.user 能匹配 routing.car.Chevrolet.Corvette.ZR1.user。
因为这种 Exchange 反对通配符的 Routing Key,因而在定义 Queen 和 Routing Key 的时候,要思考对命名进行特色分组,如:
- 懒得写了,反正就是以点为分隔符,对 Queen 和 Routing Key 做业务分组,投递的时候依照分组规定进行投递
Headers Exchange(头信息交换机)
Routing Key 是没用的,在初始化 Binding 时设置一些 map 进去,在投递音讯时带上 map 中的一些元素或全副元素,就能够实现 Exchange 到 Queen 的投递了。这种形式较上一个,灵活性无疑更高了,反对简单的 Binding,不过会不会太过简单把老手都搞晕了,所以我不太倡议用
// TODO 照例这里应该有代码,还是算了,想起来再写
参考链接 1
参考链接 2