RabbitMQ 的 socket 的长链接,它封装了 socket 协议相关部分逻辑
建立在 Connection 连接之上的一种轻量级的连接,我们大部分的业务操作是在 Channel 这个接口中完成的,包括
如果把 Connection 比作一条光纤电缆的话,那么 Channel 信道就比作成光纤电缆中的其中一束光纤。一个 Connection 上可以创建任意数量的 Channel
channel.exchangeDeclare( exchange : "ExchangeName",//交换器的名字 type: "direct",// 模式 durable: false, // 持久化 autoDelete: false, //自动删除 arguments:null 参数 );
channel.queueDeclare( queue: 队列的名称, durable: flase //是否持久化,false: 队列在内存中,服务器挂掉后,队列就没了;true: 服务器重启后,队列将会重新生成。注意:只是队列持久化,不代表队列中的消息持久化!!!! exclusive: 是否专属,专属的范围针对的是连接,一个连接下面的多个信道是可见的。对于其他连接是不可见的。连接断开后,该队列会被删除。 autoDelete: 是否自动删除, arguments: 队列参数 );
channel.basicPublish( exchange: "name", //交换机名称 routingKey: "key", //路由键 basicProperties: null, //该条消息的配置 body: Encoding.Default.GetBytes(msg) //消息字节数组 );
channel.BasicGet( queue: QueueName, //队列名称 autoAck: true //是否自动确认 );
channel.basicConsume( queue:QUEUE_NAME, autoAck:true, //是否自动ack,如果不自动ack,需要使用 channel.ack、channel.nack、channel.basicReject consumer // 消费者 );
channel.basicQos( 0, // prefetchSize:0 1, prefetchCount:1 , 告诉 RabbitMQ, 不要同时给一个消费者推送多于 1 条消息,即一旦有 1 个消息还没有 ack (确认),则该消费者将 block 掉,直到有消息确认 false //global:true\false 是否将上面设置应用于 channel,简单点说,就是上面限制是 channel 级别的还是 consumer 级别 );
channel.basicAck( e.DeliveryTag, // deliveryTag : e.DeliveryTag, 该消息的标记,ulong 类型. false //multiple:是否批量.true: 将一次性确认所有小于 deliveryTag 的消息. );
用自己的话说,这个 RoutingKey 就是表示生产者在发送消息时,交换器需要根据传入的 key 去根据队列和交换器绑定时用的 bindingKey 去匹配,这个 RoutingKey 生产者告诉交换器根据什么去分发;
channel.queueDeclare(QUEUE_NAME, false, false, false, null); channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
fanout 的 routing key 是无效的,会把消息发送到所有的绑定队列
channel.exchangeDeclare(EXCHANGE_NAME, "fanout") channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());
channel.exchangeDeclare(EXCHANGE_NAME, "topic"); channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes());
注意:使用 fanout 和 topic 需要先声明 交换器类型;需要将 exchange 个 queue 绑定;
channel.queueDeclare( queue: QueueName, //队列名称 durable: false, //队列是否持久化.false:队列在内存中,服务器挂掉后,队列就没了;true:服务器重启后,队列将会重新生成.注意:只是队列持久化,不代表队列中的消息持久化!!!! exclusive: false, //队列是否专属,专属的范围针对的是连接,也就是说,一个连接下面的多个信道是可见的.对于其他连接是不可见的.连接断开后,该队列会被删除.注意,不是信道断开,是连接断开.并且,就算设置成了持久化,也会删除. autoDelete: true, //如果所有消费者都断开连接了,是否自动删除.如果还没有消费者从该队列获取过消息或者监听该队列,那么该队列不会删除.只有在有消费者从该队列获取过消息后,该队列才有可能自动删除(当所有消费者都断开连接,不管消息是否获取完) arguments: null //队列的配置 );
简单的理解为,交换器需要根据 key 值来给我发送消息,根据 bindingKey 的规则去匹配 RoutingKey,匹配上了就发送到队列,仅对 direct 和 topic 模式有效;
channel.basicPublish( exchange: "test_exchange", routingKey: "", mandatory: false, basicProperties: null, body: Encoding.Default.GetBytes(msg) );
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。