NiFi调用HTTP API后,如何在调用HTTP API之前获取原始流文件

问题描述 投票:0回答:3

我有以下调用 Rest API 的顺序。

GenerateFlowFile
  ↓
EvaluateJSONPath
  ↓
ReplaceText (for post data creation)
  ↓
InvokeHTTP
  ↓
EvaluateXPath
  ↓
Original FlowFile (which was generated by GenerateFlowFile)

因此,在“ReplaceText”处理器之后,原始数据将被新数据替换。

如何获取原始数据并使用调用API后产生的属性?

apache-nifi
3个回答
2
投票

在原始文件处插入

UpdateAttribute
并评估一些独特的属性。

例如

MyUID = ${UUID()}

success
之后的
UpdateAttribute
连接应该进入准备流程来调用http,并且该连接的副本应该进入
MergeContent
,该连接应该结合原始和评估的内容和属性。

流量: enter image description here

UUID 和分割: enter image description here

合并内容: enter image description here


1
投票

您可以使用

GenerateFlowFile
的直接输出关系维护原始流文件,并稍后使用
MergeContent
和模式 碎片整理保留所有唯一属性 合并流文件,或者如果原始流文件内容足够小,您可以可以在更改流程文件内容之前将其移动到属性,然后在收到新数据后重新组合它们
Update Attribute
/
ReplaceText


0
投票

两个通用答案是:

  1. dagget 解释的合并内容
  2. 按照此处的描述等待/通知(最初由 Andy 撰写)

这些解决方案应该具有良好的扩展性并首先考虑。我个人觉得它们有点复杂,因此我在这里也提出了一个解决方法。

如果您正在执行 HTTP 请求,也许您可能只处理少量非常小的消息。在这种情况下,您可以考虑以下“技巧”来避免复杂性。

考虑(ab)使用属性,而不是拆分

最简单的解决方法是将所有数据放在一起。无需拆分消息,只需将原始内容的副本放入属性中即可。无论内容中返回什么内容,此属性在您的 HTTP 请求之后仍然可用。

简单的解决方案是在 HTTP 请求之前使用

ExtractText
,并使用整个内容创建一个名为 original 之类的属性。

强制警告:属性设计得很小,因此存储在内存中。因此,将大量内容放入属性中可能会很快消耗您的内存。


为未来可能的读者提供的最终解决方法:如果您控制 HTTP 服务,或者至少了解规范,请考虑是否需要让输出也包含输入。通常不会,但有时你还是能得到它!

© www.soinside.com 2019 - 2024. All rights reserved.