【问题标题】:Rabbitmq: Modify message body before consumingRabbitmq:在消费前修改消息正文
【发布时间】:2016-07-08 01:47:12
【问题描述】:

我是 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 
}
}

有什么办法吗?

【问题讨论】:

  • 嗨!我不确定我明白你想要什么。您的意思是要过滤队列中的消息,并根据条件将消息重新排队到另一个队列中?
  • 对不起,不清楚的问题。据我所知,只有一种方法可以按队列消耗来自交换的所有消息。在将消息发布到队列之前,我没有找到如何更改和过滤消息。这甚至可能吗?我不希望消息被重新排队,我希望在队列使用消息表单交换时对其进行过滤和更改。我真的希望你能理解。如果问题不清楚,我真的很抱歉
  • 别抱歉,没关系 :-) 我现在明白了,会尽力回答您的问题。

标签: java rabbitmq message-queue amqp


【解决方案1】:

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

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

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

实现您想要的更常见的方法是使用消费者来处理所有消息,在那里执行您需要的任何过滤/修改并将结果排队到第二个队列中。第二个队列将由您的普通工作人员使用。

【讨论】:

  • 太棒了!非常感谢!这正是我正在寻找的答案!
猜你喜欢
  • 1970-01-01
  • 2016-11-24
  • 2016-12-15
  • 1970-01-01
  • 2017-07-31
  • 2020-04-20
  • 2017-11-13
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多