RabbitMQ:源码分析之Queue类

RabbitMQ:源码分析之Queue类


一、Queue类的源码如下:

package org.springframework.amqp.core;

import java.util.Map;

import org.springframework.util.Assert;

public class Queue extends AbstractDeclarable {
	private final String name;

	private final boolean durable;

	private final boolean exclusive;

	private final boolean autoDelete;

	private final java.util.Map<java.lang.String, java.lang.Object> arguments;

	public Queue(String name) {
		this(name, true, false, false);
	}

	public Queue(String name, boolean durable) {
		this(name, durable, false, false, null);
	}

	public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete) {
		this(name, durable, exclusive, autoDelete, null);
	}

	public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
		Assert.notNull(name, "'name' cannot be null");
		
		this.name = name;
		this.durable = durable;
		this.exclusive = exclusive;
		this.autoDelete = autoDelete;
		this.arguments = arguments;
	}

	public String getName() {
		return this.name;
	}

	public boolean isDurable() {
		return this.durable;
	}

	public boolean isExclusive() {
		return this.exclusive;
	}

	public boolean isAutoDelete() {
		return this.autoDelete;
	}

	public java.util.Map<java.lang.String, java.lang.Object> getArguments() {
		return this.arguments;
	}

	@Override
	public String toString() {
		return "Queue [name=" + this.name + ", durable=" + this.durable + ", autoDelete=" + this.autoDelete + ", exclusive=" + this.exclusive + ", arguments=" + this.arguments + "]";
	}

}

二、Queue类的分析如下:

1 . 成员变量

1-1 . name(String)
队列的名称,不可为空。

1-2 . durable(boolean)
队列是否可持久化,默认为true。
     true:持久化队列,队列的声明会存放到Erlang自带的Mnesia数据库中,所以该队列在服务器重新启动后继续存在。
     false:非持久化队列,队列的声明会存放到内存中,当服务器关闭时内存会被清除,所以该队列在服务器重新启动后不存在。

1-3 . exclusive(boolean)
队列是否具有排它性,默认为false。
     true:
          a . 当连接关闭时connection.close()该队列会自动删除;
          b . 会对该队列加锁,其他通道channel不能访问该队列。如果强制访问会报异常下述异常,即一个队列只能有一个消费者消费。

com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=405, reply-text=RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'queue_name' in vhost '/', class-id=50, method-id=20)

     false:
          a . 当连接关闭时connection.close()该队列不会自动删除;
          b . 不会对该队列加锁,其他通道channel能访问该队列,即一个队列可以有多个消费者消费。

1-4 . autoDelete(boolean)
队列没有任何订阅的消费者时是否自动删除,默认为false。可以通过RabbitMQ Management,查看某个队列的消费者数量。如果为true,当consumers = 0时队列就会自动删除。

1-5 . arguments(Map<String, Object>)
一个Map集合,是AMQP协议留给AMQP实现做扩展使用的。
     a . 消息剩余生存时间【x-message-ttl】
统一设置队列中的所有消息的过期时间,例如设置10秒,10秒后这个队列的消息清零。也可以在发布消息的时候,单独为某个消息指定剩余生存时间,单位毫秒。

     b . 队列自动过期时间【x-expires】
x-expires用于当多长时间没有消费者访问该队列的时候,该队列会自动删除,可以设置一个延迟时间,如仅启动一个生产者,10秒之后该队列会删除;或者启动一个生产者,再启动一个消费者,消费者运行结束后10秒,队列也会被删除。

     c . 队列最大消息数目【x-max-length】
x-max-length:用于指定队列的长度,如果不指定,可以认为是无限长,例如指定队列的长度是4,当超过4条消息,前面的消息将被删除,给后面的消息腾位。

     d . 队列存储所有消息的最大存储【x-max-length-bytes】
x-max-length-bytes: 用于指定队列存储消息的占用空间大小,当达到最大值是会删除之前的数据腾出空间。

     e . 消息优先级【x-max-priority】
x-max-priority: 设置消息的优先级,优先级值越大,越被提前消费。

     f . 死亡交换机【Dead letter exchange】 和死亡路由键【 Dead letter routing key】
当队列中的消息过期,或者达到最大长度而被删除,或者达到最大空间时而被删除时,可以将这些被删除的信息推送到其他交换机中,让其他消费者订阅这些被删除的消息,处理这些消息。

     g . 延迟模式Lazy mode【x-queue-mode=lazy】
将队列设置为延迟模式,在磁盘上保留尽可能多的消息以减少RAM使用; 如果未设置,队列将保留内存缓存以尽快传递消息。先将消息保存到磁盘上,不放在内存中,当消费者开始消费的时候才加载到内存中。

     h . 主定位器Master locator【x-queue-master-locator】
将队列设置为主位置模式,确定在一个或多个节点上声明时,队列主机所在的规则。

2 . 构造方法

2-1 . 传参:队列名称

public Queue(String name) {
	this(name, true, false, false);
}

2-2 . 传参:队列名称,是否可持久化

public Queue(String name, boolean durable) {
	this(name, durable, false, false, null);
}

2-3 . 传参:队列名称,是否持久化,是否排它性,是否自动删除

public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete) {
	this(name, durable, exclusive, autoDelete, null);
}

2-4 . 传参:队列名称,是否持久化,是否排它性,是否自动删除,Map参数集

public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
	Assert.notNull(name, "'name' cannot be null");
	
	this.name = name;
	this.durable = durable;
	this.exclusive = exclusive;
	this.autoDelete = autoDelete;
	this.arguments = arguments;
}

3 . 非构造方法

3-1 . 获取队列Queue的名称

public String getName() {
	return this.name;
}

3-2 . 判断队列Queue是否可持久化

public boolean isDurable() {
	return this.durable;
}

3-3 . 判断队列Queue是否具有排它性

public boolean isExclusive() {
	return this.exclusive;
}

3-4 . 判断队列Queue是否会自动删除

public boolean isAutoDelete() {
	return this.autoDelete;
}

3-5 . 获取队列Queue的arguments参数集

public Map<String, Object> getArguments() {
	return this.arguments;
}

3-6 . 重写toString方法

@Override
public String toString() {
	return "Queue [name=" + this.name + ", durable=" + this.durable + ", autoDelete=" + this.autoDelete + ", exclusive=" + this.exclusive + ", arguments=" + this.arguments + "]";
}
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页