rabbitmq.channel方法介绍

本文详细介绍了RabbitMQ中Channel的相关操作,包括exchangeDeclare用于创建交换机,涉及exchange类型、是否持久化等参数;basicQos设置消息预取量,控制服务器发送给消费者的并发消息数量;basicPublish发布消息,包含路由键、消息持久化选项等;basicAck手动确认消息处理完成;queueDeclare声明队列以及queueBind绑定队列与交换机。这些操作是RabbitMQ中消息传递的核心部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rabbitmq.channel参数详解

channel.exchangeDeclare():使用fanout类型创建的交换机

1、type:有direct、fanout、topic三种
2、durable:truefalse true:服务器重启会保留下来Exchange。警告:仅设置此选项,不代表消息持久化。即不保证重启后消息还在
3、autoDelete:truefalse.true:当已经没有消费者时,服务器是否可以删除该Exchange

Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete,
                                       Map<String, Object> arguments) throws IOException;

chanel.basicQos(): 同一时刻服务器发多少条消息给消费者

1、prefetchSize:0 
2、prefetchCount:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该consumer将block掉,直到有消息ack
3、global:true\false 是否将上面设置应用于channel,简单点说,就是上面限制是channel级别的还是consumer级别

void basicQos(int prefetchSize, int prefetchCount, boolean global) throws IOException;

channel.basicPublish(): 向server发布一条消息

1、routingKey:路由键,#匹配0个或多个单词,*匹配一个单词,在topic exchange做消息转发用
2、mandatory:true:如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,那么会调用basic.return方法将消息返还给生产者。false:出现上述情形broker会直接将消息扔掉
3、mmediate:true:如果exchange在将消息route到queue(s)时发现对应的queue上没有消费者,那么这条消息不会放入队列中。当与消息routeKey关联的所有queue(一个或多个)都没有消费者时,该消息会通过basic.return方法返还给生产者。
4BasicProperties :需要注意的是BasicProperties.deliveryMode,0:不持久化 1:持久化 这里指的是消息的持久化,配合channel(durable=true),queue(durable)可以实现,即使服务器宕机,消息仍然保留
简单来说:mandatory标志告诉服务器至少将该消息route到一个队列中,否则将消息返还给生产者;immediate标志告诉服务器如果该消息关联的queue上有消费者,则马上将消息投递给它,如果所有queue都没有消费者,直接把消息返还给生产者,不用将消息入队列等待消费者了。

void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body)
            throws IOException;

channel.basicAck(): 消息处理完成,手动确认提交

1、deliveryTag:该消息的index
2、multiple:是否批量.true:将一次性ack所有小于deliveryTag的消息。

void basicAck(long deliveryTag, boolean multiple) throws IOException;

channel.basicConsume(): 消息消费完成确认

1、autoAck:是否自动ack,如果不自动ack,需要使用channel.ack、channel.nack、2、channel.basicReject 进行消息应答

String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException;

channel.queueDeclare(): 声明一个队列

1、durable:truefalse true:在服务器重启时,能够存活
2、exclusive :是否为当前连接的专用队列,在连接断开后,会自动删除该队列,生产环境中应该很少用到吧。
3、autodelete:当没有任何消费者使用时,自动删除该队列。

Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
                                 Map<String, Object> arguments) throws IOException;

channel.queueBind(): 将队列跟交换器进行绑定

1、queue:队列名称
2、exchange:交换机名称
3、routingKey:队列跟交换机绑定的键值
channel.queueBind(queueName, EXCHANGE_NAME, "black");
<think>我们正在将Java代码转换为C#。注意Java和C#在RabbitMQ客户端使用上的区别。 主要步骤: 1. 导入必要的命名空间(RabbitMQ.Client)。 2. 创建连接和通道(Channel)。 3. 声明队列(使用QueueDeclare方法,注意参数顺序和Java一致,但C#中参数名需要符合C#规范)。 4. 循环发送消息,并打印发送的信息。 5. 关闭通道和连接。 注意:在Java代码中,我们使用了ConnectionUtil工具类来获取连接。在C#中,我们假设也有类似的工具类(例如之前问题中的ConnectionUtil.GetConnectionAsync,但这里我们使用同步方式,因为原Java代码是同步的)。 但是,原Java代码是同步的,而之前C#示例使用了异步。我们可以根据需求选择同步或异步。这里为了与Java代码保持一致,我们使用同步方式。 另外,注意Java中的message.getBytes()默认使用平台编码,而C#中我们使用Encoding.UTF8.GetBytes(message)来确保使用UTF-8编码。 由于原Java代码中使用了Thread.sleep,在C#中我们可以使用Thread.Sleep。 转换后的C#代码: 注意:我们假设ConnectionUtil.GetConnection()是同步方法,返回一个IConnection对象。 如果之前使用的是异步,那么我们需要调整ConnectionUtil提供同步方法。但为了简单,我们这里假设有一个同步的GetConnection方法。 如果还没有同步方法,可以这样实现(在ConnectionUtil中): public static IConnection GetConnection() { var factory = new ConnectionFactory() { HostName = "localhost" }; return factory.CreateConnection(); } 下面开始转换代码:</think>以下是将提供的 Java 代码转换为 C# 的完整实现: ```csharp using RabbitMQ.Client; using System; using System.Text; using System.Threading; namespace RabbitMQ.WorkProducer { class Program { private const string QUEUE_NAME = "test_work_queue"; static void Main(string[] args) { // 获取连接(同步方式) using var connection = ConnectionUtil.GetConnection(); // 创建通道 using var channel = connection.CreateModel(); // 声明队列(参数顺序:队列名, 持久化, 排他性, 自动删除, 额外参数) channel.QueueDeclare( queue: QUEUE_NAME, durable: false, exclusive: false, autoDelete: false, arguments: null ); // 循环发布任务 for (int i = 0; i < 50; i++) { string message = "task .. " + i; byte[] body = Encoding.UTF8.GetBytes(message); // 发布消息(参数:交换机, 路由键, 基础属性, 消息体) channel.BasicPublish( exchange: "", routingKey: QUEUE_NAME, basicProperties: null, body: body ); Console.WriteLine($" [x] Sent '{message}'"); Thread.Sleep(i * 2); // 线程休眠模拟任务间隔 } // 注意:using语句会自动关闭通道和连接 } } // 假设的连接工具类(需自行实现) public static class ConnectionUtil { public static IConnection GetConnection() { var factory = new ConnectionFactory() { HostName = "localhost", // RabbitMQ服务器地址 Port = 5672, // 默认端口 UserName = "guest", // 默认用户名 Password = "guest" // 默认密码 }; return factory.CreateConnection(); } } } ``` ### 关键转换说明: 1. **命名空间**:使用 `RabbitMQ.Client` 替代 Java 的 `com.rabbitmq.client` 2. **连接管理**: - `using` 语句自动释放资源(无需手动 `close()`) - 同步连接方法 `GetConnection()`(Java 版是同步的) 3. **编码处理**:使用 `Encoding.UTF8.GetBytes()` 显式处理编码 4. **线程控制**:`Thread.Sleep()` 替代 Java 的 `Thread.sleep()` 5. **参数命名**:C# 使用命名参数提高可读性 ### 注意事项: 1. 需要安装 NuGet 包: ```bash Install-Package RabbitMQ.Client ``` 2. `ConnectionUtil` 类需根据实际服务器配置修改 3. 消息发送速率通过 `Thread.Sleep(i * 2)` 控制,随着循环递增延迟
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值