RabbitMQ养成记 (5. MQ的topics模式)

主题模式

Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符!

Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert

通配符规则:

​ #:匹配一个或多个词

​ *:匹配不多不少恰好1个词

举例:

​ audit.#:能够匹配audit.irs.corporate 或者 audit.irs

​ audit.*:只能匹配audit.irs

RabbitMQ养成记 (5. MQ的topics模式)_第1张图片
生产者:
使用topic类型的Exchange,发送消息的routing key有3种: item.isnert、item.update、item.delete:

public class Send {
    private final static String EXCHANGE_NAME = "topic_exchange_test";

    public static void main(String[] argv) throws Exception {
        // 获取到连接
        Connection connection = ConnectionUtil.getConnection();
        // 获取通道
        Channel channel = connection.createChannel();
        // 声明exchange,指定类型为topic
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");
        // 消息内容
        String message = "新增商品 : id = 1001";
        // 发送消息,并且指定routing key 为:insert ,代表新增商品
        channel.basicPublish(EXCHANGE_NAME, "item.insert", null, message.getBytes());
        System.out.println(" [商品服务:] Sent '" + message + "'");

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

消费者

public class Recv {
    private final static String QUEUE_NAME = "topic_exchange_queue_1";
    private final static String EXCHANGE_NAME = "topic_exchange_test";

    public static void main(String[] argv) throws Exception {
        // 获取到连接
        Connection connection = ConnectionUtil.getConnection();
        // 获取通道
        Channel channel = connection.createChannel();
        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        
        // 绑定队列到交换机,同时指定需要订阅的routing key。需要 update、delete
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "item.update");
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "item.delete");

        // 定义队列的消费者
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            // 获取消息,并且处理,这个方法类似事件监听,如果有消息的时候,会被自动调用
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                    byte[] body) throws IOException {
                // body 即消息体
                String msg = new String(body);
                System.out.println(" [消费者1] received : " + msg + "!");
            }
        };
        // 监听队列,自动ACK
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }
}

注意
这里大家要理解一个点。
就是 创建队列/ 然后把队列和交换机 绑定 。 以通配符的方式所绑定。
以上的这些 跟发不发消息 没有关系
他在发消息之前 就已经设置好了:

我有队列 Q1 Q2.

我给Q1的绑定规则是 T.# ,我给Q2的绑定规则是 T.*

OK 现在服务开启

好了这时候 来一条信息发送 它是要带上routingkey的
这里的routingkey 是消息要发的时候它才带过来的

消息1 来了 routingkey T.123 符合 给Q1, Q2
消息1 来了 routingkey T.123.123 符合 只给Q2
消息1 来了 routingkey P.123 不符合所有此交换机的绑定队列 不发送


以上 几篇就是 rabbitmq的入门 和java操作。
后面我会分享记录一些 和springboot的集成 让我们能更方便的使用MQ。

很多兄弟尤其是入门的编程新手 会觉得 直接看springboot的集成就好了 这些用不到。
其实你直接用框架和集成 这样对你的学习和成长是不利的,因为你不知道框架的里面到底干了些什么,你对他的理解 也会浅很多。所以一定要把初级的都看看 多动手敲一遍。 再看框架的集成

你可能感兴趣的:(RabbitMQ养成,rabbitmq)