在没有 wait/notify 处理器和 curl 命令的情况下停止 nifi 处理器

Stopping nifi processor without wait/notify processor and curl commands

我想在 invokhttp 处理器出现故障时立即终止它,因为我使用 ExecuteStreamCommand 处理器 我用这样的代码制作了 bat 文件:

curl  http://localhost:8080/nifi-api/controller/process-groups/root/processors/f511a6a1-015d-1000-970e-969eac1e6fc5'-X PUT -H 'Accept: application/json'-d @stop.json -vv

我有相关的 json 文件,代码如下:

{
  "status": {
    "runStatus": "STOPPED"
  },
  "component": {
    "state": "STOPPED",
    "id": "f511a6a1-015d-1000-970e-969eac1e6fc5"
  },
  "id": "f511a6a1-015d-1000-970e-969eac1e6fc5",
  "revision": {
    "version": 30,
    "clientId": "0343f0b9-015e-1000-7cd8-570f8953ec11"
  }
}

我使用我的 jso 文件作为 ExecuteStreamCommand 处理器内部命令的参数 bat 它抛出这样的异常:

  1. 我应该改变什么?

nifi 中您可以通过网络浏览器执行的所有操作都可以通过 nifi-api.

  • 使用google chrome你可以按F12激活DevTools (其他浏览器也有这个选项)
  • 然后 select 网络标签
  • 对 nifi 执行必要的操作(例如停止处理器)
  • right-click 请求并选择菜单 copy -> copy as cUrl (bash)

现在剪贴板中有 curl 命令,它通过调用 nifi-api

重复相同的 nifi 操作

您可以删除所有 headers 参数 (-H),除了一个:-H 'Content-Type: application/json'

因此我的处理器的停止操作将如下所示:

curl 'http://localhost:8080/nifi-api/processors/d03bbf8b-015d-1000-f7d6-2f949d44cb7f' -X PUT -H 'Content-Type: application/json' --data-binary '{"revision":{"clientId":"09dbb50e-015e-1000-787b-058ed0938d0e","version":1},"component":{"id":"d03bbf8b-015d-1000-f7d6-2f949d44cb7f","state":"STOPPED"}}'

当心! 每次更改处理器(甚至状态)时,其版本都会更改。

所以在发送 stop 请求之前,您必须获取当前版本和状态。

您必须向与上述相同的 url 发送 GET 请求,而无需任何其他 headers:

http://localhost:8080/nifi-api/processors/d03bbf8b-015d-1000-f7d6-2f949d44cb7f

其中 d03bbf8b-015d-1000-f7d6-2f949d44cb7f 是您处理器的 ID。 您可以在浏览器中尝试此 url,但替换其中的处理器 ID。

响应将在 json 中。

{"revision":
  {"clientId":"09dbb50e-015e-1000-787b-058ed0938d0e","version":4},
  "id":"d03bbf8b-015d-1000-f7d6-2f949d44cb7f",
  "uri": 
  ...a lot of information here about this processor... 
}

您可以从结果中获取 clientIdversion,并使用这些属性构建正确的 STOP 请求。

PS:

  • ExecuteStreamCommand 将流文件传输到执行命令中作为可能导致问题的输入流
    • 使用 ExecuteProcess 因为您在命令行中将所有参数传递给 curl 而不是通过输入流。
  • 你可以在不使用 curl 的情况下停止 nifi 处理器 - 你只需要像这样构建正确的处理器序列:
    • InvokeHTTP (get current state) -> EvaluateJsonPath (extract version and clientId) -> ReplaceText (build json for stop using attrs from prev step) -> InvokeHTTP (call stop)
  • 尽量避免从 nifi 中停止处理器的逻辑 - 确保这是可能的。只是 re-think 你的算法。

这里是展示如何停止调用 http 处理器的模板: https://www.dropbox.com/s/uv14kuvk2evy9an/StopInvokeHttpPoceesor.xml?dl=0