7、RabbitMQ-主题模式

本文详细介绍了RabbitMQ中主题交换机的工作原理,包括模式图解释、路由键和绑定键的规则,并通过生产者和消费者的Java代码示例展示了如何实现特定的消息路由。同时,文章还探讨了在不同路由键设置下,消息如何被分发到相应的消费者。

 

1、模式图

 

 

发送到主题交换的消息不能具有任意的 routing_key - 它必须是由点分隔的单词列表。
单词可以是任何内容,但通常它们指定与消息相关的一些功能。一些有效的路由键示例:“ stock.usd.nyse ”,“ nyse.vmw”,“ quick.orange.rabbit ”。路由密钥中可以包
含任意数量的单词,最多可达255个字节。
 
绑定密钥也必须采用相同的形式。主题交换背后的逻辑 类似于直接交换- 使用特定路
由密钥发送的消息将被传递到与匹配绑定密钥绑定的所有队列。但是绑定键有两个重
要的特殊情况:
*(星号)可以替代一个单词。
#(hash)可以替换零个或多个单词。

 

 类型是topic

 

2、实践 

 生产者

 

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.util.ConnectionUtils;

public class Send {
    
    private static final String EXCHANGE_NAME = "exchange_topic";
    
    public static void main(String[] args) throws IOException, TimeoutException {
        
        Connection conn = ConnectionUtils.getConnection();
        
        Channel channel = conn.createChannel();
        
        //exchange
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");
        
        String msg = "商品.....";
        
        //绑定路由
        String routingKey = "goods.add";
        channel.basicPublish(EXCHANGE_NAME, routingKey, null, msg.getBytes());
        
        channel.close();
        conn.close();
        
    }

}

 

 

 消费者1:

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.util.ConnectionUtils;

public class Receive {
    
    private static final String QUEUE_NAME="test_topic1";
    private static final String EXCHANGE_NAME = "exchange_topic";
    
    public static void main(String[] args) throws IOException, TimeoutException {
        
        Connection conn = ConnectionUtils.getConnection();
        
        Channel channel = conn.createChannel();
        
        //队列声明
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        
        channel.basicQos(1);
        
        //绑定队列到交换机转发器
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "goods.add");

                //定义一个消费者
                Consumer consumer = new DefaultConsumer(channel){
                    //收到消息就会触发这个方法
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
                            throws IOException {
                        String msg = new String(body,"utf-8");
                        System.out.println("消费者1接收到的消息" + msg);
                        
                        try {
                            Thread.sleep(1500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }finally{
                            System.out.println("消费者1处理完成!");
                            //手动回执
                            channel.basicAck(envelope.getDeliveryTag(), false);
                        }
                    }
                };
                //监听队列
                //自动应答false
                boolean autoAck = false;
                channel.basicConsume(QUEUE_NAME, autoAck, consumer);
    }
}

 

 

 消费者2:

 

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.util.ConnectionUtils;

public class Receive2 {
    
    private static final String QUEUE_NAME="test_topic2";
    private static final String EXCHANGE_NAME = "exchange_topic";
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection conn = ConnectionUtils.getConnection();
        Channel channel = conn.createChannel();
        
        //队列声明
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.basicQos(1);
        
        //绑定队列到交换机转发器
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "goods.#");
        
                //定义一个消费者
                Consumer consumer = new DefaultConsumer(channel){
                    //收到消息就会触发这个方法
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
                            throws IOException {
                        String msg = new String(body,"utf-8");
                        System.out.println("消费者2接收到的消息" + msg);
                        
                        try {
                            Thread.sleep(1500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }finally{
                            System.out.println("消费者2处理完成!");
                            //手动回执
                            channel.basicAck(envelope.getDeliveryTag(), false);
                        }
                    }
                };
                //监听队列
                //自动应答false
                boolean autoAck = false;
                channel.basicConsume(QUEUE_NAME, autoAck, consumer);
    }
}

 

 

此时如果生产者的String routingKey = "goods.add";
此时2个消费者都可以收到消息
若:String routingKey = "goods.del";
此时只有消费者2收到消息

 

转载于:https://www.cnblogs.com/Mrchengs/p/10531483.html

### 安装 RabbitMQ 插件 `rabbitmq-plugins` 使用教程 #### 启用延迟消息交换插件 为了启用延迟消息交换功能,在命令行界面下可以输入如下指令来激活该插件: ```bash [root@k8s-node1 rabbitmq]# rabbitmq-plugins enable rabbitmq_delayed_message_exchange [^1] ``` 此操作将会使RabbitMQ支持处理带有延时属性的消息。 #### 查看当前已安装的插件列表 要查看系统中已经存在的所有插件,可以通过下面这条命令实现: ```bash [root@localhost sbin]# ./rabbitmq-plugins list [^2] ``` 这有助于确认哪些插件已经被加载以及是否有可用的新版本等待更新。 #### 前端管理插件的安装 对于希望监控和管理系统而言,前端管理插件是非常有用的工具之一。通过运行以下命令即可完成其部署工作: ```bash rabbitmq-plugins enable rabbitmq_management [^3] ``` 一旦成功启用了这个组件,则可通过浏览器访问相应的Web控制台来进行更直观的操作与配置调整。 #### MQTT协议的支持 当涉及到物联网(IoT)应用开发时, 可能需要用到MQTT协议。此时需要确保队列名称遵循特定模式以便于识别不同类型的订阅关系;默认情况下会采用名为`amq.topic` 的主题交换机,并创建形如`mqtt-subscription-***-qos1`这样的队列[^4]。 #### Broker 和 Virtual Host 概念简介 在整个通信流程里,Broker扮演着服务器的角色负责接收来自生产者的请求并将它们转发给消费者;而Virtual Host则允许在同一实例上隔离多个独立的应用环境,从而提高了资源利用率并增强了安全性[^5].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值