RabbitMQ经典类型交换机

引言

RabbitMQ是一个开源的消息代理中间件,基于AMQP(高级消息队列协议)实现。它提供了可靠的消息传递机制,用于不同应用程序之间的通信。

在RabbitMQ中,交换机(Exchange)起着关键的作用。它接收来自生产者的消息,并根据特定的规则将消息路由到一个或多个队列中。RabbitMQ提供了几种类型的交换机,本文将重点介绍经典类型交换机(Classic Exchange)。

经典类型交换机的特点

经典类型交换机是RabbitMQ中最常用的交换机类型之一。它通过一组预定义的规则将消息路由到绑定的队列中。

经典类型交换机有四种不同的路由模式:

  1. 直接路由模式(Direct)
  2. 主题路由模式(Topic)
  3. 广播路由模式(Fanout)
  4. 头部路由模式(Headers)

接下来,我们将逐一介绍这些路由模式的特点以及如何在Java中使用经典类型交换机。

直接路由模式 Direct

直接路由模式是最简单的路由模式之一。它根据消息的路由键(Routing Key)将消息路由到绑定了相同路由键的队列中。以下是一个使用直接路由模式的示例代码:

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

public class DirectExchangeExample {

    private final static String EXCHANGE_NAME = "direct_exchange";
    private final static String QUEUE_NAME = "direct_queue";
    private final static String ROUTING_KEY = "direct_routing_key";

    public static void main(String[] args) throws Exception {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 创建连接
        Connection connection = factory.newConnection();

        // 创建通道
        Channel channel = connection.createChannel();

        // 声明交换机
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");

        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        // 绑定队列到交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);

        // 发送消息
        String message = "Hello, RabbitMQ!";
        channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.getBytes());
        System.out.println("Sent message: " + message);

        // 关闭连接
        channel.close();
        connection.close();
    }
}

以上代码的主要步骤包括创建连接工厂、创建连接、创建通道、声明交换机、声明队列、绑定队列到交换机以及发送消息。

主题路由模式 Topic

主题路由模式允许使用通配符将消息路由到匹配的队列中。通配符可以是"*"(匹配一个单词)或"#"(匹配零个或多个单词)。以下是一个使用主题路由模式的示例代码:

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

public class TopicExchangeExample {

    private final static String EXCHANGE_NAME = "topic_exchange";
    private final static String QUEUE_NAME = "topic_queue";
    private final static String ROUTING_KEY = "topic.routing.key";

    public static void main(String[] args) throws Exception {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 创建连接
        Connection connection = factory.newConnection();

        // 创建通道
        Channel channel = connection.createChannel();

        // 声明交换机
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");

        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        // 绑定队列到交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);

        // 发送消息
        String message = "Hello, RabbitMQ!";
        channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.getBytes());
        System.out.println("Sent message: " + message);

        // 关闭连接
        channel.close();
        connection.close();
    }
}