Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何轮询RabbitMQ以连续获取优先级顺序的消息?_Rabbitmq_Priority Queue - Fatal编程技术网

如何轮询RabbitMQ以连续获取优先级顺序的消息?

如何轮询RabbitMQ以连续获取优先级顺序的消息?,rabbitmq,priority-queue,Rabbitmq,Priority Queue,通过从安装插件RabbitMQ优先级队列,我们可以使RabbitMQ成为分布式优先级队列。我将元素推送到队列中,每个元素都有一个优先级,我能够根据需要在使用者中接收队列的内容——优先级较高的元素首先出现 问题在于,当这种情况持续发生时,优先级轮询概念不起作用: 运行发布服务器以填充队列中具有不同优先级的3个项目。 使用队列中的消息-工作正常-根据使用 优先事项现在,消费者等待队列中的任何消息,如 现在队列是空的。 我再次运行publisher来填充大约5个元素。 使用者不会优先使用队列中的5项,

通过从安装插件RabbitMQ优先级队列,我们可以使RabbitMQ成为分布式优先级队列。我将元素推送到队列中,每个元素都有一个优先级,我能够根据需要在使用者中接收队列的内容——优先级较高的元素首先出现

问题在于,当这种情况持续发生时,优先级轮询概念不起作用:

运行发布服务器以填充队列中具有不同优先级的3个项目。 使用队列中的消息-工作正常-根据使用 优先事项现在,消费者等待队列中的任何消息,如 现在队列是空的。 我再次运行publisher来填充大约5个元素。 使用者不会优先使用队列中的5项,而是按照步骤3发布者发布的顺序使用。 我需要的是,在队列的所有内容中具有最大优先级的队列项目的每次轮询都应该首先出现

有人能告诉我这里发生了什么错误吗?谢谢

以下是publisher和consumer Java的片段:

出版者

输出:


我可以使用basicGet来轮询队列,而不是consumer.nextDelivery来解决这个问题。最终字符串消息=new Stringchannel.basicGetQUEUE_NAME,true.getBody;这将从队列中提取具有最高优先级的项目

你有没有费心设置basic.qos?否则,你可以在while循环中睡一会儿,看看会发生什么。谢谢你的回复@Adam Gent。我通过使用basicGet而不是consumer.nextDelivery实现了上述功能。最终字符串消息=new Stringchannel.basicGetQUEUE_NAME,true.getBody;这将根据队列中的优先级检索项目。
public class RabbitMQPublisher {
    private static final String QUEUE = "my-priority-queue-3";
    public static void main(String[] argv) throws Exception {
        final ConnectionFactory factory = new ConnectionFactory();
        final Connection conn = factory.newConnection();
        final Channel ch = conn.createChannel();
        final Map<String, Object> args = new HashMap<String, Object>();
        args.put("x-max-priority", 100);
        ch.queueDeclare(QUEUE, true, false, false, args);
        publish(ch, 24);
        publish(ch, 11);
        publish(ch, 75);
        //second run
        //publish(ch, 27);
        //publish(ch, 77);
        //publish(ch, 12);
        conn.close();
    }

    private static void publish(Channel ch, int priority) throws IOException {
        final BasicProperties props = MessageProperties.PERSISTENT_BASIC.builder().priority(priority).build();
        final String body = "message with priority " + priority;
        ch.basicPublish("", QUEUE, props, body.getBytes());
    }
while (true) {
        final QueueingConsumer.Delivery delivery = consumer.nextDelivery();
        final String message = new String(delivery.getBody());
        System.out.println(message);
    }
message with priority 75
message with priority 24
message with priority 11
message with priority 27
message with priority 77
message with priority 12