RabbitMQ:一个worker听多个队列,但一次收到一条消息

时间:2018-03-09 09:09:31

标签: rabbitmq

有没有办法可以设置一个工作人员来监听多个队列,但是一次只能处理来自单个队列的单个消息?

用例: 1.任务A. 2.任务B. 3.任务C

我想要10个工人。 #1 - #3可以处理任务A,#1 - #6可以处理任务B,所有人都可以处理任务C.

我曾经让所有的工作人员都听取了所有的队列,但是当一些任务无法由太多的工作人员处理时(例如,对另一个服务进行过多的并发请求),他们就会出现问题。

当队列为空而其他队列已满时,让工作人员监听单个队列会浪费其资源。

1 个答案:

答案 0 :(得分:0)

根据要求,工作人员可以一次处理任何一个任务,我建议为所有3种类型的消息创建一个队列,并使所有10个工作者成为此公共队列的接收者。 您可以使用自定义标头AMQP.BasicProperties - &gt; Map<String,Object> headers区分消息。

例如,

发件人和队列:

(1)如果您可以控制发件人和队列:

制作单个队列而不是3个不同的队列,如下所示。 发件人将在发布之前为每封邮件添加自定义标头。 headers.put("type","Task#")

enter image description here

(2)如果您无法控制发件人和队列:

您可以使用Processorheaders.put("type","Task#")添加到每封邮件中,然后将其发送至common queue。如下图所示。

enter image description here

工人:

每个工作人员都可以检查收到的消息的类型并采取相应的行为。工人4,5,6可以处理TaskB&amp;仅限TaskC。在任何时候都会处理任何消息。 (如下面的代码段所述 - 仅供参考)

//Worker 4,5,6  (sample steps)
public void handler(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) {
    if(properties.getHeaders().get("type").equals("TaskA")) {
        // Negative acknowledgement - the message will be requeue.
    }
    else if(properties.getHeaders().get("type").equals("TaskB")) {
        // Convert body into TaskB (if required)
        // Process Task B
        // Positive acknowledgement
    }
    else if(properties.getHeaders().get("type").equals("TaskC")) {
        // Convert body into TaskC (if required)
        // Process Task C
        // Positive acknowledgement
    }
}