【问题标题】:Stopping nifi processor without wait/notify processor and curl commands在没有等待/通知处理器和 curl 命令的情况下停止 nifi 处理器
【发布时间】:2017-08-21 11:42:51
【问题描述】:

我想在 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. 我应该改变什么?

【问题讨论】:

  • 未找到响应 404。可能您指定了错误的 url。查看 nifi-api 文档:nifi.apache.org/docs/nifi-docs/rest-api
  • 处理器资源的基本 URL 路径是 /nifi-api/processors/...,因此请尝试取出您正在使用的路径中的 .../controller/process-groups/root/... 部分。
  • 我试过了,但是prosessor仍然抛出同样的异常

标签: apache-nifi


【解决方案1】:

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

  • 使用谷歌浏览器可以按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 请求之前,您必须获取当前版本和状态。

您必须向与上述相同的 url 发送 GET 请求,而无需任何额外的标头:

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 中停止处理器的逻辑 - 确定这是可能的。只需重新考虑您的算法即可。

【讨论】:

  • 谢谢我通过 InvokeHTTP(获取当前状态)-> EvaluateJsonPath(提取版本和 clientId)-> ReplaceText(构建 json 以停止使用上一步中的 attrs)-> InvokeHTTP(调用停止),它完美地工作
  • 但我添加了执行脚本,用于为 put requst 制作 json 内容
【解决方案2】:

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

【讨论】:

  • 无等待/通知处理器和休息 api
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多