Apache nifi 在nifi中,如何调用在参数中询问输入文件和输出文件的外部程序

Apache nifi 在nifi中,如何调用在参数中询问输入文件和输出文件的外部程序,apache-nifi,Apache Nifi,我有一个外部程序,一个电子书转换器,将.epub转换为.txt。 这个转换器请求一个文件作为输入,另一个文件作为输出,文件名在这里很重要,因为扩展名用于确定应该进行哪种转换,同样根据我在测试时看到的情况,程序正在对输入文件执行寻道。因此,这些合同禁止使用命名管道或SDTIN重定向 对于另一个项目,或者至少是一个POC,我必须封装一个与上面工作方式相同的现有工具包,并在Nifi中更好地重新创建工作流 在短期内,编写自定义处理器是不可能的 那我该怎么做呢 以下是我发现的几种可能的解决方案: 创建一

我有一个外部程序,一个电子书转换器,将.epub转换为.txt。 这个转换器请求一个文件作为输入,另一个文件作为输出,文件名在这里很重要,因为扩展名用于确定应该进行哪种转换,同样根据我在测试时看到的情况,程序正在对输入文件执行寻道。因此,这些合同禁止使用命名管道或SDTIN重定向

对于另一个项目,或者至少是一个POC,我必须封装一个与上面工作方式相同的现有工具包,并在Nifi中更好地重新创建工作流

在短期内,编写自定义处理器是不可能的

那我该怎么做呢

以下是我发现的几种可能的解决方案:

  • 创建一个PutFile处理器,该处理器将把文件放在一个临时位置,用一个executeStreamCommand链接它,executeStreamCommand将执行外部命令,把输出放在一个临时位置,并用一个fetchFileProcessor链接它。但这里的问题可能是,我必须找到一种方法来清理临时文件

  • 另一种解决方案是创建一个脚本,与ExecuteScript一起使用,以执行以下操作:基于属性使用文件名将流文件写入磁盘,执行外部命令,将输出文件读取到流文件并执行一些清理。但从我发现的情况来看,从这个处理器写入磁盘并不是那么容易,对吗


那么我该往哪个方向走,有什么建议吗?

你走对了。我认为您可以执行如下一系列处理器:

  • -为输入和输出文件名创建属性
  • -写入临时输入文件
  • -运行转换实用程序。我建议将其包装在shell脚本中,这样您就有机会在临时输入文件完成时清理它
  • -将转换输出读取到FlowFile内容中。使用
    删除文件
    完成策略
    清理转换后的文件

  • 谢谢,这就是我的结尾,我刚刚在
    ExecuteProcess
    的oputput中添加了第二个
    FetchFile
    ,并将
    完成策略设置为
    Delete File
    以清理临时输入文件。这似乎不再有效(Nifi 1.6.0)-或者至少不会在一个链中起作用-因为
    ExecuteProcess
    被标记“源”,不接受入站链接。
    ExecuteStreamCommand
    可能在这种情况下工作。