有没有办法可以设置一个工作人员来监听多个队列,但是一次只能处理来自单个队列的单个消息?
用例: 1.任务A. 2.任务B. 3.任务C
我想要10个工人。 #1 - #3可以处理任务A,#1 - #6可以处理任务B,所有人都可以处理任务C.
我曾经让所有的工作人员都听取了所有的队列,但是当一些任务无法由太多的工作人员处理时(例如,对另一个服务进行过多的并发请求),他们就会出现问题。
当队列为空而其他队列已满时,让工作人员监听单个队列会浪费其资源。
答案 0 :(得分:0)
根据要求,工作人员可以一次处理任何一个任务,我建议为所有3种类型的消息创建一个队列,并使所有10个工作者成为此公共队列的接收者。
您可以使用自定义标头AMQP.BasicProperties
- &gt; Map<String,Object> headers
区分消息。
例如,
发件人和队列:
(1)如果您可以控制发件人和队列:
制作单个队列而不是3个不同的队列,如下所示。
发件人将在发布之前为每封邮件添加自定义标头。 headers.put("type","Task#")
(2)如果您无法控制发件人和队列:
您可以使用Processor
将headers.put("type","Task#")
添加到每封邮件中,然后将其发送至common queue
。如下图所示。
工人:
每个工作人员都可以检查收到的消息的类型并采取相应的行为。工人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
}
}