2

私はApache NIFIにかなり慣れていません。

「ホットフォルダー」に入れられるファイルがあるフローを設定したいと思います。このフォルダーにファイルが配置されていることを検出すると、このファイルは「input」という別のフォルダーに配置されます。ファイルが入力フォルダーにコピーされたら、Java プログラムをトリガーして実行したいと思います。

私がこれにアプローチした方法は、「GETFILE」プロセッサを作成して、ホット フォルダからファイルを取得することです。次に、PUTFILE プロセッサを作成して入力フォルダに配置します。したがって、「GETFILE」プロセッサと「PUTFILE」プロセッサの間に接続リンクがあることが想像できます。これは期待どおりに機能します。

ただし、私が直面している課題は、ファイルが INPUT フォルダーにコピーされたとき (つまり、PUTFILE プロセッサが実行された後) に Java プロセスを実行することです。PUTFILE と EXECUTEPROCESS プロセッサ間のリンクを作成できません (ファイルがホット フォルダから入力フォルダにコピーされた後に Java プロセスを実行するよう NIFI に指示する手段として)。PUTFILE プロセッサと EXECUTEPROCESS プロセッサの間をリンクするための接続矢印を取得できないようです (NIFI では許可されないため)。

上記の説明に基づいて、入力フォルダーに追加されているファイルを検出した後に、NIFI に Java アプリケーションの実行をトリガーするように指示するアプローチを推奨できる人はいますか?

ありがとう。

4

1 に答える 1

6

あなたがやろうとしていることは非常に理にかなっており、実際にそのプロセッサで同様のことを許可していました. ただし、入力フロー ファイルをどう処理するかを決定することがかなり問題になるエッジ ケースが十分にあることが判明したため、現在の非常に明示的なモデルがあります。これは、基本的には、プロセッサと cron スケジューリングを組み合わせたものは派手な 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)

ご不明な点がございましたら、お気軽にお問い合わせください。

ありがとうジョー

于 2016-02-05T02:03:23.677 に答える