Rabbitmq:在使用之前修改消息体

时间:2016-03-21 13:56:21

标签: java rabbitmq message-queue amqp

我是RabbitMQ的新手,我想在通过队列消费之前修改消息。我有一个应该保持不可接触的交换。客户端使用特定的路由密钥接收消息。但是有很多这些,我想在将它们发布到队列之前过滤和更改主体。

Exchange填充邮件如下所示:

{
"_context_domain": "unsuitable",
"_msg_id": "1",
"_context_quota_class": null, 
"_context_read_only": false,
"_context_request_id": "1"
}

{
"_context_domain": "suitable",
"_msg_id": "2",
"_context_quota_class": null, 
"_context_read_only": false,
"_context_request_id": "2"
}

有没有办法在消费前过滤和修改它们? 例如:

...
channel.queueBind(QUEUE_NAME, "EXCHANGE_NAME", "ROUTNG_KEY");
final Consumer consumer = new DefaultConsumer(channel) {
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
              String message = new String(body, "UTF-8");
              Gson mapper = new Gson();
              SomeObject object = (SomeObject) mapper.fromJson(message, SomeObject.class);
                     if (SomeObject.getContext_domain = "suitable"){
                           //publish somehow SomeObject.getMsg_id into QUEUE_NAME 
}
}

有什么办法吗?

1 个答案:

答案 0 :(得分:3)

AMQP支持的交换不允许对邮件正文进行过滤。您可以使用"topic" or "header" exchanges,它可以根据路由密钥或邮件头来路由邮件。

但是,它们都不允许您修改消息本身。如果你想这样做,你需要开发自己的实现交换的RabbitMQ插件。

如果你想走那条路,这很容易。但是,交换并不是为此目的而设计的:它们只是路由表。如果你这样做,RabbitMQ中的通道进程将消耗资源来做你想要的任何修改(即交换不是一个过程,它基本上是一个表中的一行)。这也意味着可能会阻止同一连接上的其他客户端,直到通道完成修改和排队消息。

实现所需内容的更常见方法是使用使用者处理所有消息,执行所需的任何过滤/修改,并将结果排入第二个队列。第二个队列将由您的正常工作人员使用。