我正在尝试使用apache nifi读取RabbitMQ代理。重要的是,我可以检索与消息关联的路由密钥,并将有效负载和路由密钥写入文件。
我已经使用python来读取路由键,所以我很肯定它存在。
我正在使用链接到PutFile处理器的ConsumeAMQP处理器。所有写入的都是有效负载,而不是路由密钥。
答案 0 :(得分:2)
ConsumeAMQP
处理器解析传入的消息并将其形成Apache NiFi flowfile
。流文件结构包括名为 attributes 的键/值对列表以及内容的任意字节。根据{{1}}文档的"Additional Details"部分:
这个处理器做了两件事。它通过提取构造FlowFile 来自消费的AMQP消息(身体和属性)的信息。 消息消耗后,将构建FlowFile。消息体 被写入FlowFile及其 com.rabbitmq.client.AMQP.BasicProperties 被转移到 FlowFile作为属性。 AMQP属性名称以 amqp $ 为前缀 前缀。
AMQP属性以下是可用的标准AMQP列表 消息可能附带的属性:(“amqp $ contentType”, “amqp $ contentEncoding”,“amqp $ headers”,“amqp $ deliveryMode”, “amqp $ priority”,“amqp $ correlationId”,“amqp $ replyTo”, “amqp $ expiration”,“amqp $ messageId”,“amqp $ timestamp”,“amqp $ type”, “amqp $ userId”,“amqp $ appId”,“amqp $ clusterId”)
如果此处未包含您要查找的属性(除非命名约定异常,但似乎不是),您应检查它是否包含在com.rabbitmq.client.AMQP.BasicProperties中(它不包含)看起来是)。我不是RabbitMQ专家,但是从this link看起来路由密钥是消息上的一些属性, exchange 注册以便路由传入的消息。 See also: RabbitMQ "AMQP 0-9-1 Model Explained"
我会检查传入消息的 amqp $ headers 属性(您可以暂停使用消耗ConsumeAMQP
处理器以在连接中排队这些流文件并实时检查它们)以查看如果您可以使用NiFi表达式语言提取路由密钥。具有动态属性PutFile
和类似(未测试)UpdateAttribute
的表达式的routingKey
处理器将生成一个名为${amqp$headers.routing_key}
的新flowfile属性,其中包含您要查找的值。如果它不存在,它将在com.rabbitmq.client.Envelope
object, accessible via Envelope.getRoutingKey()
上,但我不相信NiFi此时会将此对象暴露给处理器。需要在ConsumeAMQP.java @ L101
进行更改。你可以file a feature request via Jira。
要记住的另一件事是,即使您将路由密钥提取到属性,routingKey
也非常清楚地记录它只打印流文件内容到文件,而不是属性。如果需要修改流文件的内容以包含属性,请使用PutFile
处理器将属性插入到地图结构或其他所需格式中。