Apache NIFI:将文件添加到目录后直接运行Java进程

时间:2016-02-04 17:53:24

标签: java apache-nifi

我是Apache NIFI的新手。

我想设置一个流程,其中有一个文件可以放入一个热门文件夹'。如果此文件夹检测到放入其中的文件,则此文件将被放入名为“输入”的另一个文件夹中。将文件复制到输入文件夹后,我想触发Java程序运行。

我接触到这种方式的方法是创建一个' GETFILE'处理器从热文件夹中获取文件。然后创建一个PUTFILE处理器将其放入输入文件夹。因此,您可以想象' GETFILE'之间存在连接链接。和' PUTFILE'处理器。这可以按预期工作。

然而,我面临的挑战是,当文件被复制到INPUT文件夹时(即在执行PUTFILE处理器之后),触发我的Java进程运行。我无法在PUTFILE和EXECUTEPROCESS处理器之间创建链接(作为在将文件从hot文件夹复制到输入文件夹之后告诉NIFI运行Java进程的一种方法)。我似乎无法在PUTFILE和EXECUTEPROCESS处理器之间建立连接箭头(因为NIFI不会让我这么做)。

基于以上描述,是否有人可以推荐一种方法告诉NIFI在检测到文件被添加到输入文件夹后触发Java应用程序运行?

感谢。

1 个答案:

答案 0 :(得分:6)

您要做的事情很有意义,我们实际上习惯于允许与该处理器类似的东西。事实证明,虽然有足够的边缘情况,但是决定如何处理输入流文件变得相当成问题,因此我们有一个当前非常明确的模型,这基本上意味着处理器与cron-scheduling相结合是一个奇特的cron工具。

所以,我们转而采用的是NiFi 0.5.0版本,这应该是几天之内。因为我们有https://issues.apache.org/jira/browse/NIFI-210这是一个非常令人兴奋的功能,允许脚本在流内进行。 ExecuteScript处理器听起来非常适合您的情况。例如,如果您运行此代码,则可以在存在数据时触发该代码,并且可以等待侦听输出并将其捕获为流文件属性。然后,您甚至可以对响应的内容进行路由等。

def flowFile = session.get()
if (flowFile == null) {
    return;
}
def procout = new StringBuffer(512), procerr = new StringBuffer(512)
def proc = "java -version".execute()
proc.consumeProcessOutput(procout, procerr)
proc.waitForOrKill(1000)
flowFile = session.putAttribute(flowFile, "Process Output", procout.toString())
flowFile = session.putAttribute(flowFile, "Process Error", procerr.toString())
session.transfer(flowFile, REL_SUCCESS)

如果您有更多问题,请告诉我们。

由于 乔