RabbitMQ消息队列中的Channel信道参数详解

 更新时间:2023年08月28日 08:32:58   作者:辰小白  
这篇文章主要介绍了RabbitMQ消息队列中的Channel信道参数详解,信道是生产消费者与rabbit通信的渠道,生产者publish或者消费者消费一个队列都是需要通过信道来通信的,信道是建立在TCP上面的虚拟链接,需要的朋友可以参考下

RabbitMQ Channel 参数

1. channel.exchangeDeclare()

参数:

exchange:交换机名称

type:

fanout

fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中

direct

direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中。

topic

规则就是模糊匹配,可以通过通配符满足一部分规则就可以传送。它的约定是: routing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit” binding key与routing key一样也是句点号“. ”分隔的字符串。 binding key中可以存在两种特殊字符“”与“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

durable:是否开启持久化exchange

autoDelete: 当已经没有消费者时,服务器是否可以删除该exchange

arguments: 扩展参数

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

2. channel.basicQos()

参数:

prefetchSize:消息的大小

prefetchCount:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该consumer将block掉,直到有消息ack

global:是否将上面设置应用于channel,简单点说,就是上面限制是channel级别的还是consumer级别

备注:据说prefetchSize 和global这两项,rabbitmq没有实现,暂且不研究

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

3. channel.basicPublish()

参数:

exchange:名称 routingKey:路由键,#匹配0个或多个单词,*匹配一个单词,在topic exchange做消息转发用

mandatory:为true时如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,那么会调用 basic.return方法将消息返还给生产者。为false时出现上述情形broker会直接将消息扔掉   immediate:为true时如果exchange在将消息route到queue(s)时发现对应的queue上没有消费者,那么这条消息不会放入队列中。当与消息routeKey关联的所有queue(一个或多个)都没有消费者时,该消息会通过basic.return方法返还给生产者。

props:需要注意的是BasicProperties.deliveryMode,1:不持久化 2:持久化 这里指的是消息的持久化,配合channel(durable=true),queue(durable)可以实现,即使服务器宕机,消息仍然保留

body:要发送的信息

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

4. channel.basicAck()

参数:

deliveryTag:该消息的index

multiple:是否批量处理.true:将一次性ack所有小于deliveryTag的消息

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

5. channel.basicNack()

参数:

deliveryTag:该消息的index

multiple:是否批量.true:将一次性拒绝所有小于deliveryTag的消息

requeue:被拒绝的是否重新入队列 注意:如果设置为true ,则会添加在队列的末端

void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException;

6. channel.basicConsume()

参数:

queue:队列名称

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

callback:回调函数

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

7. chanel.exchangeBind()

参数:

生产者发送消息到source交换器中,source根据路由键找到与其匹配的另一个交换器destination,并把消息转发到destination中,存储在destination绑定的队列queue中

Exchange.BindOk exchangeBind(String destination, String source, String routingKey) throws IOException;

8. channel.queueDeclare()

参数:

queue: 队列名称

durable: 是否持久化, 队列的声明默认是存放到内存中的,如果rabbitmq重启会丢失,如果想重启之后还存在就要使队列持久化,保存到Erlang自带的Mnesia数据库中,当rabbitmq重启之后会读取该数据库

exclusive:是否排外的,有两个作用,一:当连接关闭时connection.close()该队列是否会自动删除;二:该队列是否是私有的private,如果不是排外的,可以使用两个消费者都访问同一个队列,没有任何问题,如果是排外的,会对当前队列加锁,其他通道channel是不能访问的,如果强制访问会报异常,一般等于true的话用于一个队列只能有一个消费者来消费的场景

autodelete:当没有任何消费者使用时,自动删除该队列

arguments:扩展参数。如:x-message-ttl

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

9. channel.queueBind()

参数:

queue 队列名称

exchange 交换机名称

routingKey 路由key

AMQP.Queue.BindOk queueBind(String queue , String exchange , String routingKey ) throws IOException;

到此这篇关于RabbitMQ消息队列中的Channel信道参数详解的文章就介绍到这了,更多相关RabbitMQ的Channel参数信道内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis插入后返回主键id的3种方式图解

    mybatis插入后返回主键id的3种方式图解

    这篇文章主要给大家介绍了关于mybatis插入后返回主键id的3种方式,很多时候,在向数据库插入数据时,需要保留插入数据的,以便进行后续的操作或者将存入其他表作为外键,需要的朋友可以参考下
    2023-08-08
  • SpringBoot+Response如何统一返回result结果集

    SpringBoot+Response如何统一返回result结果集

    这篇文章主要介绍了SpringBoot+Response如何统一返回result结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java中数组list map三者之间的互转介绍

    java中数组list map三者之间的互转介绍

    java中 数组 list map之间的互转一张图清晰呈现并附有代码,不懂的朋友可以参考下
    2013-10-10
  • 详解Java引用类型的参数也是值传递

    详解Java引用类型的参数也是值传递

    这篇文章主要介绍了Java引用类型的参数也是值传递,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 基于Hutool的图片验证码功能模块实现

    基于Hutool的图片验证码功能模块实现

    为了提高系统的安全性,防止接口被暴力刷新,验证码是个好的手段,图片验证码没有短信验证码的费用,其是个人开发者学习的重点,这篇文章主要介绍了基于Hutool的图片验证码功能模块实现,需要的朋友可以参考下
    2022-10-10
  • Java中Arraylist的最大长度

    Java中Arraylist的最大长度

    这篇文章主要介绍了Java中Arraylist的最大长度,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java分布式锁、分布式ID和分布式事务的实现方案

    Java分布式锁、分布式ID和分布式事务的实现方案

    在分布式系统中,分布式锁、分布式ID和分布式事务是常用的组件,用于解决并发控制、唯一标识和数据一致性的问题,本文将介绍Java中常用的分布式锁、分布式ID和分布式事务的实现方案,并通过具体的示例代码演示它们的用法和应用场景
    2023-06-06
  • java kafka如何动态设置用户读写权限

    java kafka如何动态设置用户读写权限

    这篇文章主要介绍了java kafka如何动态设置用户读写权限问题,具有很好的参考家价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java基础教程之实现接口

    Java基础教程之实现接口

    这篇文章主要介绍了Java基础教程之实现接口,也可以说是实施接口,因为接口只是定义,最终要实现它,本文就专门讲解接口的实现,需要的朋友可以参考下
    2014-08-08
  • SpringCloud Gateway中GatewayFilterChain执行流程详解

    SpringCloud Gateway中GatewayFilterChain执行流程详解

    Spring Cloud Gateway旨在为微服务架构提供一种简单有效的、统一的 API 路由管理方式。Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,它不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全、监控/埋点和限流等
    2022-10-10

最新评论