1, What is a priority queue
In the service level test, the priority mechanism of the task to be executed needs to be considered, that is, through the thread priority, and the purpose of setting the priority
It is a setting mechanism that allows tasks with high priority to be executed first and tasks with low priority to be executed later when resources are very tight. Of course, it is such a setting mechanism
It can only be executed in asynchronous mode. If the design is executed in synchronous mode, the design lacks macro dimension thinking from the perspective of the system. stay
RabbitMQ also provides a queue priority mechanism in the mechanism. The purpose of this design is that producers produce too fast while consumers consume too much
When resources are tight or limited, the messages of tasks with high queue priority are consumed first, while
Messages with low priority are consumed later. Of course, if the resources are not tight, setting priorities actually doesn't make much sense, because it's better at this time
The messages that come first are consumed first, and there is no queuing mechanism or priority mechanism.
2, Implementation mechanism of priority
For priority setting, it is set on the consumer side. The specific parameters are x-max-priority, and the codes involved are as follows:
//set priority Map<String,Object> arguments =new HashMap<String,Object>(); arguments.put("x-max-prioroty",10); channel.queueDeclare(queueName,true,false,false,arguments);
In this way, after the consumer's code is executed, the priority of the message queue can be seen on the WEB console of RabbitMQ, as shown below
Show:
As described above, we demonstrated how to configure the maximum priority of a queue. In fact, the core is to set the priority of the current sending task when the producer sends a message
The codes involved are as follows:
AMQP.BasicProperties properties=new AMQP.BasicProperties.Builder() .deliveryMode(2) .contentEncoding("UTF_8") .headers(headers) .priority(8) .build(); String msg = "Hello RabbitMQ priority Message"+i; channel.basicPublish(exchangeName,routyKey,true,properties,msg.getBytes());
In the above, the priority of the sending task we set is 8.
3, Priority queue actual combat code
3.1. Producer code
package com.example.rabbitmq.priority; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import java.util.HashMap; import java.util.Map; public class ProducerPriority { private static final String exchangeName="test_priority_exchange"; private static final String routyKey="priority.test"; public static void main(String[] args) throws Exception { ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost("101.**.***.84"); connectionFactory.setPort(5672); connectionFactory.setUsername("wuya"); connectionFactory.setPassword("java"); connectionFactory.setVirtualHost("/"); Connection connection = connectionFactory.newConnection(); Channel channel = connection.createChannel(); for(int i=0;i<3;i++) { Map<String,Object> headers=new HashMap<String,Object>(); headers.put("num",i); if (i==0) { AMQP.BasicProperties properties=new AMQP.BasicProperties.Builder() .deliveryMode(2) .contentEncoding("UTF_8") .headers(headers) .priority(8) .build(); String msg = "Hello RabbitMQ priority Message"+i; channel.basicPublish(exchangeName,routyKey,true,properties,msg.getBytes()); } else if (i==1) { AMQP.BasicProperties properties=new AMQP.BasicProperties.Builder() .deliveryMode(2) .contentEncoding("UTF_8") .headers(headers) .priority(3) .build(); String msg = "Hello RabbitMQ priority Message"+i; channel.basicPublish(exchangeName,routyKey,true,properties,msg.getBytes()); } else { AMQP.BasicProperties properties=new AMQP.BasicProperties.Builder() .deliveryMode(2) .contentEncoding("UTF_8") .headers(headers) .priority(9) .build(); String msg = "Hello RabbitMQ priority Message"+i; channel.basicPublish(exchangeName,routyKey,true,properties,msg.getBytes()); } } } }
In the above, we set the priority of the sent task according to the number.
3.2. Consumer code
package com.example.rabbitmq.priority; import com.example.rabbitmq.MyConsumer; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import java.util.HashMap; import java.util.Map; public class ConsumerPriority { private static final String exchangeName = "test_priority_exchange"; private static final String queueName="test_priority_queue"; private static final String routingKey="priority.#"; public static void main(String[] args) throws Exception { try{ ConnectionFactory connectionFactory=new ConnectionFactory(); connectionFactory.setHost("101.**.***.84"); connectionFactory.setPort(5672); connectionFactory.setUsername("wuya"); connectionFactory.setPassword("java"); connectionFactory.setVirtualHost("/"); Connection connection=connectionFactory.newConnection(); Channel channel=connection.createChannel(); //set priority Map<String,Object> arguments =new HashMap<String,Object>(); arguments.put("x-max-prioroty",10); channel.exchangeDeclare(exchangeName,"topic",true,false,null); channel.queueDeclare(queueName,true,false,false,arguments); channel.queueBind(queueName,exchangeName,routingKey); channel.basicConsume(queueName,true,new MyConsumer(channel=channel)); }catch (Exception e){ e.printStackTrace(); } } }
3.3. Custom consumer code
package com.example.rabbitmq; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.DefaultConsumer; import com.rabbitmq.client.Envelope; import java.io.IOException; public class MyConsumer extends DefaultConsumer { //To enable current limiting, you need to set channel private Channel channel; /** * Constructs a new instance and records its association to the passed-in channel. * * @param channel the channel to which this consumer is attached */ public MyConsumer(Channel channel) { super(channel); this.channel=channel; } @Override public void handleDelivery( String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.err.println("---------------consumer---------------\n"); System.err.println("the message received:"+new String(body)); System.err.println("message priority:"+properties.getPriority()); } }
3.4 execution result information
After the above code is executed, of course, there is no shortage of current resources, so they will be consumed in the normal order. The specific output results are as follows:
As mentioned above, it mainly summarizes the summary of message queue priority and its case application. Thank you for reading!