Default Exchange(默认交换机)
在首先创立一个 Queen 之后,RabbitMQ 会把这个 Queen 间接绑定到默认交换机上,并且应用 Queen 的名字作为 Routing Key。
因而,对外体现的成果就是,客户端向这个 Queen 间接投递音讯,严格匹配。
// TODO 此处应该有代码
Direct exchange(直连交换机)
和 Default Exchange 相似,但灵便度更高,基于 AMQP 协定,能够由 Producer 或 Consumer 进行指定,伪代码如下:
//实现BeanPostProcessor类,应用Bean的生命周期函数@Componentpublic 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