RabbitMQ客户端开发向导 (2)

​ 这个方法同样有重载的方法,来默认化一些参数。

【六】创建队列Queue Queue.DeclareOK queueDeclare( String queue, // 声明队列名称 boolean durable, // 声明是否持久化 boolean exclusive, // 声明是否排他 boolean autoDelete, // 声明是否自动删除 Map<String, Object> arguments // 设置队列的其他一些参数 ) throws IOException

知识点:队列持久化

​ 创建队列的时候也可以设置是否支持持久化到磁盘,生产环境中我们一般都会将其设置为持久化,这也保证了服务器宕机的情况下重启后,队列可以恢复,以保证数据安全(高可用要点之二)

知识点:排他队列

​ 创建队列的时候有一个排他参数exclusive,排他队列只对首次创建该队列的信道所在的连接可见,并且该连接内的所有信道都可以访问这个排他队列,在这个连接断开之后,该队列自动删除,由此可见这个队列可以说是绑到连接上的,对同一服务器的其他连接不可见。

​ 这种排他优先于持久化,即使设置了队列持久化,在连接断开后,该队列也会自动删除。

​ 非排他队列不依附于连接而存在,同一服务器上的多个连接都可以访问这个队列。

知识点:队列自动删除

​ 队列的自动删除类似于交换器的自动删除,都必须是曾经使用过的队列才能执行自动删除,如果是创建之后根本就没有用过的队列是不会触发自动删除的。

​ 这个方法同样有重载的方法,来默认化一些参数。

【七】绑定队列queueBind Queue.BindOK queueBind( String queue, // 指定队列名称 String exchange, // 指定交换器名称 String routingKey, // 声明绑定key Map<String,Object> arguments // 定义绑定的一些参数 ) throws IOException

​ 这里routingKey的值需要由指定的交换器的类型累决定使用什么形式的key,如果是fanout类型的交换器,会忽略routingKey的值,如果是direct类型的交换器,使用明确的绑定Key,如果是topic类型的交换器,则使用带有匹配符*或#的模糊key。

【八】发布消息basicPublish void basicPublish( String exchange, // 指定目的交换器 String routingKey, // 声明消息的路由key boolean mandatory, // 是否为无法路由的消息进行返回处理 boolean immediate, // 是否对路由到无消费者队列的消息进行返回处理 BasicProperties props, // 消息的一些基本属性设置 byte[] body // 消息体 ) throws IOException

知识点:mandatory

​ 消息发布的时候设置消息的mandatory属性用于设置消息在发送到交换器之后无法路由到队列的情况对消息的处理方式,设置为true表示将消息返回到生产者,否则直接丢弃消息。

​ 上述无法路由的情况可以是在无法找到匹配消息路由key的队列,导致消息无法路由到队列中

​ 当mandatory=true时,出现无法路由消息被返回,那么返回的消息又回到生产者,怎么接收呢,这就要靠返回监听器ReturnListener

知识点:ReturnListener

​ 我们在设置消息的mandatory=true的时候,就需要对返回的消息进行处理了,我们可以在信道中添加返回监听器来监听返回的消息,一旦监听到这些消息,我们就着手对其进行再处理,一般我们会进行重发。

channel.addReturnListener(new ReturnListener(){ @Override publish void handleReturn( int repayCode, // 回应码 String repayText, // 回应内容 String exchange, // 来源交换器 String routingKey, // 消息的路由key AMQP.BasicProperties basicProperties, // 消息的其他属性 byte[] body // 消息体 ) throws IOException { // do some thing to handle the return message } }); 【九】消费消息basicConsumer、basicGet 1、推送消息basicConsume String basicConsume( String queue, // 指定队列名称 boolean autoAck, // 是否自动回应 String consumerTag, // 声明消费者标签,区分不同的消费者 boolean noLocal, // 是否不能将消息推送给同一个连接内的消费者 boolean exclusive, // 是否排他 Map<String, Object> arguments, // 设置消费者的其他参数 Consumer callback // 设置消费者回调函数,处理消息 ) throws IOException

知识点:自动回应

​ 推送消息时设置消息自动回应,那么消息在推送给消费者后就会自动回应服务器,服务器收到回回应就会删除这条消息,这样无法保证消息能被正确处理,因为消费者虽然收到了消息,但它可能无法处理、或者拒绝等,这时服务器中消息却已被删除,导致消息丢失。(高可用要点之三)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywzds.html