《RabbitMQ系列教程-第四章-08-Header类型交换机》

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 《RabbitMQ系列教程-第四章-08-Header类型交换机》,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

教程说明



RabbitMQ交换机之Header类型交换机

4.8.1 简介

关于RabbitMQ官网提供的所有交换模式我们都已经介绍完毕了,唯独还有一个header类型的交换机没有介绍,那header类型的交换机又有什么作用呢?

header类型的ExchangeRouting有点类似,不同的是,header类型的Exchange取消了Routing Key,使用key/value来匹配队列

header的匹配有两种方式,一种是all另一种是any。这两种方式是在接收端必须要用键值"x-mactch"来定义。

  • all:代表必须匹配Consumer端的所有键值对

  • any:代表只要匹配Consumer端的任意一个键值对即可

在这里插入图片描述

4.8.2 生产者

package com.lscl.rabbitmq;

import com.rabbitmq.client.*;
import com.rabbitmq.client.AMQP.BasicProperties.Builder;

import java.util.HashMap;
import java.util.Map;

public class Producer06_Header {

    public static void main(String[] args) throws Exception {
        // 创建连接和频道
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.40.132");
        factory.setPort(5672);
        factory.setUsername("lscl");
        factory.setPassword("admin");
        factory.setVirtualHost("/lscl");

        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        /*
            定义一个交换机为header类型
            true:代表持久化
            true:代自动删除(没有consumer时自动销毁)
            false:代表不是内部使用的交换机
            null:传递的参数为null
         */
        String exchangeName = "test_header";

        // 声明交换机和类型headers
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.HEADERS, true, false, false, null);

        String queue = "test_header_queue";
        // 定义队列
        channel.queueDeclare(queue, true, false, false, null);

		// 声明header
        Map<String, Object> bindingHeaders = new HashMap<>();
        /*
            all:代表发送消息时必须匹配header中的所有key/val对
            any:代表发送消息时只需要匹配header中的任意一个key/val对
         */
        bindingHeaders.put("x-match", "all");
        bindingHeaders.put("key1", "147");
        bindingHeaders.put("key2", "258");
        bindingHeaders.put("key3", "369");

        // 将交换机绑定到队列,并指定header信息
        channel.queueBind(queue, exchangeName, "", bindingHeaders);

        String body = "header....";

		// 发送信息携带的header
        Map<String, Object> requestHeader = new HashMap<>();
        requestHeader.put("key1", "147");
//        requestHeader.put("key2", "258");
//        requestHeader.put("key3", "369");

        // 消息配置对象
        Builder properties = new AMQP.BasicProperties.Builder();
        properties.headers(requestHeader);

        // 将消息直接发送给交换机(携带指定的参数header),让交换机自己根据header条件去转发到指定queue
        channel.basicPublish(exchangeName, "", properties.build(), body.getBytes());

        channel.close();
        connection.close();
    }
}

4.8.3 消费者

package com.lscl.rabbitmq;

import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;

import com.rabbitmq.client.*;

public class Consumer11_Header {
    public static void main(String[] args) throws Exception {
        // 创建连接和频道
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.40.132");
        factory.setPort(5672);
        factory.setUsername("lscl");
        factory.setPassword("admin");
        factory.setVirtualHost("/lscl");

        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        channel.basicConsume("test_header_queue", true, new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

                System.out.println("body:" + new String(body));
            }
        });

    }
}

4.8.4 header类型交换机小结

header类型交换机中,放弃了routing key,取而代之的是key/value键值对,在Producer绑定队列时指定key/value键值对,当Producer发送消息时也会指定一个key/value键值对,如果此时的key/value键值对符合当初绑定队列的键值对,那么消息就可以路由到此队列,反之消息则丢失;

  • header类型交换机工作原理图:

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131800.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!