queueDeclare 相对于 exchangeDeclare 方法而言,重载方法的个数就少很多 它只 有两个重载方法:
Queue.DeclareOk queueDeclare() throws IOException;
Queue.DeclareOk queueDeclare (String queue , boolean durable , boolean exclusive , boolean autoDelete , Map arguments) throws IOException;
不带任何参数的 queueDeclare 方法默认创建一个由 RabbitMQ 命名的(类似这种 amq.gen-LhQzlgv3GhDOv8PIDabOXA 名称,这种队列也称之为匿名队列〉、排他的、自动删除 的、非持久化的队列。
方法的参数详细说明如下所述。
~ queue 队列的名称。
~ durable: 设置是否持久化。为 true 则设置队列为持久化。持久化的队列会存盘,在 服务器重启的时候可以保证不丢失相关信息。
~ exclusive 设置是否排他。为 true 则设置队列为排他的。如果一个队列被声明为排 他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除。这里需要注意 三点:排他队列是基于连接( Connection) 可见的,同 个连接的不同信道 (Channel) 是可以同时访问同一连接创建的排他队列; "首次"是指如果 个连接己经声明了 排他队列,其他连接是不允许建立同名的排他队列的,这个与普通队列不同:即使该队 列是持久化的,一旦连接关闭或者客户端退出,该排他队列都会被自动删除,这种队列 适用于一个客户端同时发送和读取消息的应用场景。
~ autoDelete: 设置是否自动删除。为 true 则设置队列为自动删除。自动删除的前提是: 至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会 自动删除。不能把这个参数错误地理解为: "当连接到此队列的所有客户端断开时,这 个队列自动删除",因为生产者客户端创建这个队列,或者没有消费者客户端与这个队 列连接时,都不会自动删除这个队列。
~ argurnents: 设置队列的其他一些参数,如 x-rnessage-ttl 、x-expires 、x-rnax-length 、x-rnax-length-bytes、 x-dead-letter-exchange、 x-deadletter-routing-key 、 x-rnax-priority 等。
对应于 exchangeDeclareNoWait 方法,这里也有 queueDeclareNoWait 方法:
void queueDeclareNoWait(String queue , boolean durable , boolean exclusive , boolean autoDelete , Map arguments) throws IOException;
方法的返回值也是 void ,表示不需要服务端的任何返回 同样也 需要注意 ,在调用 queueDeclareNoWait 方法之后,紧接着使用声明的队列时有可能会发生异常情况。
同样这里还有 queueDeclarePassive 的方法,也比较常用。这个方法用来检测相 应的队列是否存在。 如果存在 正常返回 ,如果不存在则抛出异常: 404 channel exception ,同时Channel 也会被关闭。方法定义如下:
Queue.DeclareOk queueDeclarePassive(String queue) throws IOException;
与交换器对应,关于 队列也有删除的相应方法 :
Queue.DeleteOk queueDelete(String queue) throws IOException
Queue.DeleteOk queueDelete(String queue , boolean ifUnused, boolean ifEmpty ) throws IOException;
void queueDeleteNoWait(String queue , boolean fUnused boolean ifEmpty) throws IOException;
其中 queue 表示队列的名称 ifUnused 可以参考上一小节的交换器。 ifEmpty 设置为 true 表示在队列为空(队列里面没有任何消息堆积)的情况下才能够删除。
与队列相关的还有一个有意思 的方法一-queuepurge ,区别于 queueDelete ,这个方 法用来清空队列中的内容,而不删除队列本身,具体定义如下:
Queue.PurgeOk queuePurge(String queue ) throws IOException;