使用IDEA开发RabbitMQ教程系列(四)RabbitMQ的Queue队列和Message详细使用

1、导读

本章节主要介绍Queue队列和消息Message的详细介绍。包含构建过程中各参数的详细解释,话不多说我们开始吧

2、Queue队列

在第一章 初识RabbitMQ 中我们简单介绍了Queue,Queue的主要是作用于存储消息;在之前的样例中大家应该能看到如何构建一个Queue,即queueDeclare方法

queueDeclare

queueDeclare 有两个重载方法

Queue.DeclareOk queueDec1are() throws IOException;

第一种不带任何参数的queueDeclare 方法默认创建一个由RabbitMQ 命名的(类似这种amq.gen-LhQzlgv3GhDOv8PIDabOXA 名称,这种队列也称之为匿名队列〉、排他的、自动删除的、非持久化的队列。

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

第二种方法参数详解:

  • queue :队列的名称

  • durable :设置是否持久化。为true 则设置队列为持久化。持久化的队列会存盘,在服务器重启的时候可以保证不丢失相关信息

  • exclusive :设置是否排他(独占队列)。为true 则设置队列为排他的。如果一个队列被声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除。这里需要注意三点:排他队列是基于连接( Connection) 可见的,同一个连接的不同信道(Channel)是可以同时访问同一连接创建的排他队列; "首次"是指如果一个连接己经声明了一个排他队列,其他连接是不允许建立同名的排他队列的,这个与普通队列不同:即使该队列是持久化的,一旦连接关闭或者客户端退出,该排他队列都会被自动删除,这种队列适用于一个客户端同时发送和读取消息的应用场景

  • autoDelete :设置是否自动删除,当最后一个监听被移除后,自动删除队列;也就是说至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除

  • arguments :设置队列的一些其他参数;

queueBind

在之前的代码样例种我们能看到queueBind这个方法,它的主要作用是将交换机和队列进行绑定;我们主要讲解其两个构造方法的参数详解

Queue.BindOk queueBind(String queue , String exchange , String routingKey)
Queue.BindOk queueBind(String queue , String exchange , String routingKey , Map arguments)

方法中涉及的参数详解:

  • queue :声明的队列名称
  • exchange : 声明的交换机名称
  • routingKey :用来绑定队列和交换器的路由键
  • argument :定义绑定的一些参数

queueUnbind

同理既有绑定操作也必然有解绑操作,方法如下,参数和绑定都是一样的裂解,不再码字了~

Queue.BindOk queueUnBind(String queue , String exchange , String routingKey)
Queue.BindOk queueUnBind(String queue , String exchange , String routingKey , Map arguments)

3、Massage 消息

它是服务器和应用程序间传输的数据,我们在前面的样例代码种可以看到发送消息的样例;Channel.basicPublish 方法,它有几个重载方法

(1) void basicPublish (String exchange , String routingKey, BasicProperties props ,byte[) body) throws IOException ;

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

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

具体参数详细介绍如下:

  • exchange :交换器的名称,指明消息需要发送到哪个交换器中,如果设置为空,则默认发送到RabbitMQ 默认的交换器中
  • routingKey : 路由键
  • mandatory :当mandatory 参数设为true 时,交换器无法根据自身的类型和路由键找到一个符合条件的队列,那么RabbitMQ 会调用Basic.Return 命令将消息返回给生产者。当mandatory参数设置为false 时,出现上述情形,则消息直接被丢弃(再往后的教程中再详细讲解)
  • immediate :当imrnediate参数设为true时,如果交换器在将消息路由到队列时发现队列上并不存在任何消费者,那么这条消息将不会存入队列中。当与路由键匹配的所有队列都没有消费者时,该消息会通过Basic.Return返回至生产者
  • props :消息的基本属性集,分别有
    1、contentType (消息类型)
    2、contentEncoding (消息编码)
    3、headers( Map) (自定义的一些消息数据)
    4、deliveryMode (消息是否持久化 = 2)
    5、priority (消息优先级)
    6、correlationld (可以理解为消息的唯一ID)
    7、replyTo (消息重回队列)
    8、expiration (过期时间)
    9、messageld
    10、timestamp
    11、type
    12、userld
    13、appld
    14、clusterld
  • body :消息体( payload ) 需要发送的消息

接下来我们还是用一段代码来加深理解

public class MessageProducer {

	public static void main(String[] args) throws Exception {
		//1 创建ConnectionFactory
		ConnectionFactory connectionFactory = new ConnectionFactory();
		connectionFactory.setHost("192.168.1.28");
		connectionFactory.setPort(5672);
		connectionFactory.setVirtualHost("/");
		connectionFactory.setUsername("toher");
		connectionFactory.setPassword("toher888");
		//2 创建Connection
		Connection connection = connectionFactory.newConnection();
		//3 创建Channel
		Channel channel = connection.createChannel();
		//4 声明
		String routingKey = "test.direct";
		//5 发送
		Map headers = new HashMap<>();
		headers.put("param1", "111");
		headers.put("param1", "222");

		AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
				.deliveryMode(2) //设置持久化
				.contentEncoding("UTF-8")
				.expiration("10000") //设置10秒过期
				.headers(headers) //传递自定义headers
				.build();
		String msg = "Test Message";
		//exchangeName 为空 默认走RabbitMQ默认交换机
		channel.basicPublish("", routingKey , properties , msg.getBytes());
		channel.close();
		connection.close();
	}
	
}

4、结语

本篇教程详细介绍了Queue队列和消息Message包含构建过程中各参数的详细解释,朋友们可以按照测试样例进行对应测试,感谢大家的支持~谢谢!

5、导航

上一篇:RabbitMQ Exchange交换机的详细使用
下一篇:RabbitMQ可靠性投递生产者确认机制

你可能感兴趣的:(RabbitMQ,RabbitMQ教程,RabbitMQ,queue教程,RabbitMQ入门教程)