在没有 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 它抛出这样的异常:
- 我应该改变什么?
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...
}
您可以从结果中获取 clientId
和 version
,并使用这些属性构建正确的 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
我想在 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 它抛出这样的异常:
- 我应该改变什么?
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...
}
您可以从结果中获取 clientId
和 version
,并使用这些属性构建正确的 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