在nifi中,如何调用在参数中询问输入文件和输出文件的外部程序
in nifi, how to call an external program that ask an input file and an output file in parameters
我有一个外部程序,一个电子书转换器,可以将 .epub 转换为 .txt。
该转换器请求一个文件作为输入,另一个文件作为输出,文件名在这里很重要,因为扩展名用于确定应该进行哪种转换,而且从我在测试时看到的情况来看,程序正在对输入文件执行搜索。因此,这些限制阻止了命名管道或 SDTIN 重定向的使用。
对于另一个项目,或者至少是一个 POC,我将不得不封装一个现有的工具包,这些工具的工作方式与上述相同,并在 Nifi 中重新创建工作流程。
短期内,编写自定义处理器是不可能的。
那我应该怎么做呢?
这是我找到的几个可能的解决方案:
创建一个将文件放在临时位置的 PutFile 处理器,将其与执行外部命令并将输出放在临时位置的 executeStreamCommand 链接起来,然后将其与 fetchFileProcessor 链接起来。但是这里的问题可能是我必须找到一种清理临时文件的方法。
另一种解决方案是创建一个与 ExecuteScript 一起使用的脚本来执行类似的操作:将流文件写入磁盘,根据属性使用文件名,执行外部命令,将输出文件读取到流文件中,然后进行一些清洁。但是据我发现,从这个处理器写入磁盘并不是那么容易,对吧?
那我该往哪个方向走,有什么建议吗?
你走在正确的轨道上。我想你可以像下面这样做一系列处理器:
- UpdateAttribute - 为输入和输出文件名创建属性。
- PutFile - 写入临时输入文件。
- ExecuteProcess - 运行 转换实用程序。我建议将其包装在 shell 脚本中,这样您就有机会在完成时清理临时输入文件。
- FetchFile - 将转换输出读入 FlowFile 内容。使用
Delete File
的 Completion Strategy
清理转换后的文件。
我有一个外部程序,一个电子书转换器,可以将 .epub 转换为 .txt。 该转换器请求一个文件作为输入,另一个文件作为输出,文件名在这里很重要,因为扩展名用于确定应该进行哪种转换,而且从我在测试时看到的情况来看,程序正在对输入文件执行搜索。因此,这些限制阻止了命名管道或 SDTIN 重定向的使用。
对于另一个项目,或者至少是一个 POC,我将不得不封装一个现有的工具包,这些工具的工作方式与上述相同,并在 Nifi 中重新创建工作流程。
短期内,编写自定义处理器是不可能的。
那我应该怎么做呢?
这是我找到的几个可能的解决方案:
创建一个将文件放在临时位置的 PutFile 处理器,将其与执行外部命令并将输出放在临时位置的 executeStreamCommand 链接起来,然后将其与 fetchFileProcessor 链接起来。但是这里的问题可能是我必须找到一种清理临时文件的方法。
另一种解决方案是创建一个与 ExecuteScript 一起使用的脚本来执行类似的操作:将流文件写入磁盘,根据属性使用文件名,执行外部命令,将输出文件读取到流文件中,然后进行一些清洁。但是据我发现,从这个处理器写入磁盘并不是那么容易,对吧?
那我该往哪个方向走,有什么建议吗?
你走在正确的轨道上。我想你可以像下面这样做一系列处理器:
- UpdateAttribute - 为输入和输出文件名创建属性。
- PutFile - 写入临时输入文件。
- ExecuteProcess - 运行 转换实用程序。我建议将其包装在 shell 脚本中,这样您就有机会在完成时清理临时输入文件。
- FetchFile - 将转换输出读入 FlowFile 内容。使用
Delete File
的Completion Strategy
清理转换后的文件。