Apache nifi 使用Apache Nifi读取AMQP路由密钥

Apache nifi 使用Apache Nifi读取AMQP路由密钥,apache-nifi,Apache Nifi,我正在尝试使用ApacheNIFI读取RabbitMQ代理。重要的是,我可以检索与消息关联的路由密钥,并将有效负载和路由密钥写入文件 我已经使用python读取了路由密钥,因此我确信它是存在的 我正在使用ConsumeAMQP处理器,它链接到一个PutFile处理器。写入的只是有效负载,而不是路由键。ConsumeAMQP处理器解析传入消息并将其形成Apache NiFi流文件。flowfile结构包括一个称为属性的键/值对列表和内容的任意字节。根据ConsumeAMQP文档的章节: 这个处理器

我正在尝试使用ApacheNIFI读取RabbitMQ代理。重要的是,我可以检索与消息关联的路由密钥,并将有效负载和路由密钥写入文件

我已经使用python读取了路由密钥,因此我确信它是存在的


我正在使用ConsumeAMQP处理器,它链接到一个PutFile处理器。写入的只是有效负载,而不是路由键。

ConsumeAMQP处理器解析传入消息并将其形成Apache NiFi
流文件。flowfile结构包括一个称为属性的键/值对列表和内容的任意字节。根据
ConsumeAMQP
文档的章节:

这个处理器做两件事。它通过提取数据来构造流文件 来自已使用AMQP消息的信息(正文和属性)。 一旦消息被使用,就会构造一个流文件。消息体 写入流文件及其 com.rabbitmq.client.AMQP.BasicProperties被转移到 流文件作为属性。AMQP属性名称的前缀为AMQP$ 前缀

AMQP属性以下是可用的标准AMQP列表 消息可能附带的属性:(“amqp$contentType”, “amqp$contentEncoding”、“amqp$headers”、“amqp$deliveryMode”, “amqp$priority”、“amqp$correlationId”、“amqp$replyTo”, “amqp$到期”、“amqp$消息ID”、“amqp$时间戳”、“amqp$类型”, “amqp$userId”、“amqp$appId”、“amqp$clusterId”)

如果您要查找的属性未包含在此处(除非命名约定不寻常,否则它似乎不包含在此处),则应检查它是否包含在中(似乎不包含)。我不是RabbitMQ专家,但从它看来,路由密钥是exchange注册的消息上的某个属性,以便路由传入消息

我会检查传入消息上的amqp$headers属性(您可以暂停使用
PutFile
处理器,将这些流文件在连接中排队并实时检查),以查看是否可以使用NiFi表达式语言提取路由密钥。具有动态属性
routingKey
和类似(未测试的)
${amqp$headers.routing_key}
的表达式的
UpdateAttribute
处理器将生成一个名为
routingKey
的新流文件属性,该属性具有您要查找的值。如果它不在那里,它会在上,但我不相信NiFi在这个时候向处理器公开这个对象。这方面需要作出改变。你可以


要记住的另一件事是,即使您将路由密钥提取到属性,
PutFile
非常清楚地记录了它只将flowfile内容打印到文件,而不是属性。如果需要修改流文件的内容以包含属性,请使用
ReplaceText
处理器以映射结构或其他所需格式插入属性

仅供参考,这仍然是相关的,以下是该问题的当前jira: