前言

最近在优化行为组件,需要使用把接口的行为也统一RabbitMQ来接收,那么可能会造成MQ堆积大量请求时,需要实时触发的消息得不到及时的处理,所以考虑启用RabbitMQ的优先级队列功能。

简介

RabbitMQ3.5以上支持优先级队列,顾名思义,具有高优先级的消息具备优先被消费的特权,可以通过配置队列的x-max-priority参数来开启。

使用

开启队列

Map<String, Object> map = new HashMap();
map.put("x-max-priority",10);
channel.queueDeclare(queueName, true, false, false, map);

通过管理页面可以看到Pri的标识
输入图片描述
上面的代码配置了一个最小为0,最大优先级为10的消息队列

发送优先级消息

AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.priority(8);
AMQP.BasicProperties properties = builder.build();
channel.basicPublish(exchangeName, routingKey, properties, msg.getBytes());

以上代码发送了一条优先级为8的消息,如果不设置优先级,那么消息的优先级最低,系统会优先投递设置了优先级的消息。

注意:当Broker中没有消息堆积的情况下,优先级的设置也没有什么意义。

注解使用

    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange(value = "ai_action_dev_tomxin", durable = "true", type = "topic"),
            value = @Queue(value = "action_dev_tomxin", durable = "true", 
                           arguments = {@Argument(name = "x-max-priority", value = "10", type = "java.lang.Integer")}),
            key = "action_dev_tomxin.#"), containerFactory = "actionContainerFactory")
    @RabbitHandler
    public void action(Message message) {

    }