RabbitMQ通配符模式

简介: RabbitMQ通配符模式

简介

RabbitMQ是一个开源的消息中间件,在分布式系统中被广泛应用于消息的传递和处理。它支持多种工作模式,其中之一是通配符(TOPIC)模式。本文将对RabbitMQ的通配符模式进行详细的讲解。

通配符模式是一种灵活的消息传递模式,可以根据消息的路由键(routing key)和绑定(binding)模式来实现精确的消息过滤和匹配。在RabbitMQ中,路由键由生产者定义,用于标识消息的目的地,而绑定则由消费者定义,用于指定消息的接收规则。

通配符模式使用符号“#”和“”来进行模式匹配。其中,“#”表示匹配零个或多个单词,“”表示匹配一个单词。例如,路由键“news.sports.#”可以匹配诸如“news.sports.football”和“news.sports.tennis”等多个消息,而路由键“news.sports.*”只能匹配到一个消息,如“news.sports.football”。

在RabbitMQ中,生产者将消息发送到交换机(exchange),而消费者则从队列(queue)中接收消息。在通配符模式中,交换机通过匹配路由键和绑定模式来将消息路由到相应的队列中。一个队列可以有多个绑定,一个绑定可以匹配多个路由键,这使得消息可以被多个消费者接收。

通配符模式的一个重要概念是通配符表达式(binding pattern),它定义了绑定的模式规则。通配符表达式可以包含多个单词和通配符符号,以及点号(.)进行分隔。通配符表达式越精确,匹配的消息越准确。

通配符模式的优势在于它可以灵活地匹配消息,使得消息可以根据不同的条件进行过滤和选择。通过合理地定义绑定和路由键,我们可以实现复杂的消息过滤和路由策略,提高系统的灵活性和性能。

当使用RabbitMQ的通配符模式时,我们可以使用Java代码来创建生产者和消费者来实现消息的发送和接收。

代码演示

首先,我们需要添加RabbitMQ Java客户端库的依赖项,例如在Maven项目中,我们可以添加以下依赖项:

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.9.0</version>
</dependency>

接下来,我们可以编写生产者的代码来发送消息。首先,我们需要创建一个连接到RabbitMQ服务器的连接工厂,并设置服务器的地址、端口、用户名和密码。然后,我们可以使用连接工厂创建一个连接,并创建一个通道。

生产者

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class Producer {
   
    private static final String EXCHANGE_NAME = "topic_exchange";

    public static void main(String[] args) {
   
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");

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

            channel.exchangeDeclare(EXCHANGE_NAME, "topic");

            String routingKey = "topic.key1";
            String message = "Hello RabbitMQ!";
            channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes());

            System.out.println("Message sent: " + message);

            channel.close();
            connection.close();
        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }
}

在上面的代码中,我们首先声明一个主题交换机,然后使用basicPublish方法将消息发送到指定的交换机及路由键。

接下来,我们可以编写消费者的代码来接收消息。同样,我们需要创建一个连接工厂,并设置服务器的地址、端口、用户名和密码。然后,我们可以使用连接工厂创建一个连接,并创建一个通道。接着,我们可以声明一个主题交换机,并创建一个自动生成的队列。最后,我们可以使用basicConsume方法来接收消息。

消费者

import com.rabbitmq.client.*;

public class Consumer {
   
    private static final String EXCHANGE_NAME = "topic_exchange";

    public static void main(String[] args) {
   
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");

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

            channel.exchangeDeclare(EXCHANGE_NAME, "topic");
            String queueName = channel.queueDeclare().getQueue();
            channel.queueBind(queueName, EXCHANGE_NAME, "topic.*");

            System.out.println("Waiting for messages...");

            Consumer consumer = new DefaultConsumer(channel) {
   
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
   
                    String message = new String(body, "UTF-8");
                    System.out.println("Received message: " + message);
                }
            };

            channel.basicConsume(queueName, true, consumer);

        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }
}

在上面的代码中,我们首先声明一个主题交换机,然后创建一个自动生成的队列,并使用queueBind方法将队列绑定到交换机上,指定需要接收的消息路由键的模式。

最后,我们创建一个消费者对象,重写handleDelivery方法来处理接收到的消息。然后,使用basicConsume方法来注册消费者。

通过以上的代码,我们就可以在通配符模式下进行消息的发送和接收了。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
1月前
|
消息中间件
RabbitMQ的 RPC 消息模式你会了吗?
【9月更文挑战第11天】RabbitMQ 的 RPC(远程过程调用)消息模式允许客户端向服务器发送请求并接收响应。其基本原理包括:1) 客户端发送请求,创建回调队列并设置关联标识符;2) 服务器接收请求并发送响应至回调队列;3) 客户端根据关联标识符接收并匹配响应。实现步骤涵盖客户端和服务器的连接、信道创建及请求处理。注意事项包括关联标识符唯一性、回调队列管理、错误处理及性能考虑。RPC 模式适用于构建可靠的分布式应用程序,但需根据需求调整优化。
|
2月前
|
消息中间件 开发者
【RabbitMQ深度解析】Topic交换器与模式匹配:掌握消息路由的艺术!
【8月更文挑战第24天】在消息队列(MQ)体系中,交换器作为核心组件之一负责消息路由。特别是`topic`类型的交换器,它通过模式匹配实现消息的精准分发,适用于发布-订阅模式。不同于直接交换器和扇形交换器,`topic`交换器支持更复杂的路由策略,通过带有通配符(如 * 和 #)的模式字符串来定义队列与交换器间的绑定关系。
53 2
|
2月前
|
消息中间件
RabbitMQ广播模式
RabbitMQ广播模式
48 1
|
2月前
|
消息中间件 应用服务中间件 网络安全
rabbitMQ镜像模式搭建
rabbitMQ镜像模式搭建
|
3月前
|
消息中间件 传感器 负载均衡
消息队列 MQ使用问题之如何配置一主一从的同步复制模式
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
消息队列 MQ使用问题之如何配置一主一从的同步复制模式
|
3月前
|
消息中间件 存储 Kafka
MetaQ/RocketMQ 原理问题之RocketMQ DLedger融合模式的问题如何解决
MetaQ/RocketMQ 原理问题之RocketMQ DLedger融合模式的问题如何解决
|
3月前
|
消息中间件 Java Apache
消息队列 MQ使用问题之如何在内外网环境下使用单组节点单副本模式
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
3月前
|
消息中间件 负载均衡 RocketMQ
MetaQ/RocketMQ 原理问题之在广播模式下,RebalanceService工作的问题如何解决
MetaQ/RocketMQ 原理问题之在广播模式下,RebalanceService工作的问题如何解决
|
4月前
|
消息中间件
RabbitMQ配置单活模式队列
RabbitMQ配置单活模式队列
109 0
|
4天前
|
消息中间件 存储 弹性计算
云消息队列RabbitMQ实践
云消息队列RabbitMQ实践