在没有等待/通知处理器和curl命令的情况下停止nifi处理器

时间:2017-08-21 11:42:51

标签: apache-nifi

我希望一旦失败就终止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处理器内部命令的参数,它会抛出这样的异常:

  1. 我应该改变什么?
  2. enter image description here

2 个答案:

答案 0 :(得分:1)

你可以通过网络浏览器在nifi中通过nifi-api完成的所有nifi操作。

  • 使用谷歌浏览器,您可以按F12激活DevTools (其他浏览器也有此选项)
  • 然后选择网络标签
  • 在nifi上执行必要的操作(例如停止处理器)
  • 右键点击请求,然后选择菜单copy -> copy as cUrl (bash)

现在你在剪贴板中有curl命令,通过调用nifi-api重复相同的nifi动作

您可以删除所有标题参数(-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请求之前,您必须获取当前版本&状态。

您必须将GET请求发送到与上述相同的网址,而不需要任何其他标头:

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

其中d03bbf8b-015d-1000-f7d6-2f949d44cb7f是处理器的ID。 您可以在浏览器中尝试此网址,但替换其中的处理器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请求。 enter image description here

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)
  • 尽量避免停止处理器的逻辑 - 确保它是可能的。只是重新思考你的算法。

答案 1 :(得分:0)

这里是模板,显示如何停止invokehttp处理器: https://www.dropbox.com/s/uv14kuvk2evy9an/StopInvokeHttpPoceesor.xml?dl=0