使用Apache Nifi读取AMQP路由密钥

时间:2018-01-31 16:26:31

标签: apache-nifi

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

我已经使用python来读取路由键,所以我很肯定它存在。

我正在使用链接到PutFile处理器的ConsumeAMQP处理器。所有写入的都是有效负载,而不是路由密钥。

1 个答案:

答案 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处理器将属性插入到地图结构或其他所需格式中。