LoginSignup
0
0

More than 3 years have passed since last update.

executeGroovyScript で FlowFile が NULL だった時の対応

Last updated at Posted at 2018-10-15

はじめに

今回はマジで備忘録です。
が、だいぶ悩んだのでメモ書きとして残しておきます。
とはいえど、もう少し時間が経ってドキュメントが揃ってきたら大したことではないので不要になるでしょうが…

executeGroovyScript で FlowFile が NULL だった時どうするのか?

まず executGroovyScript とは Apache NiFi と呼ばれるツールで Groovy を用いた Script を書く時に使う Processor のことです。
詳しくは下記を参照のこと。
データフローオーケストレーションツールApache NiFiとは?

私の現場では、ですが以下のように使います。

def flowFile = session.get()
if(flowFile != null){
 // なんかの処理
 session.transfer(flowFile, REL_SUCCESS)
}
else {
 session.transfer(flowFile, REL_FAILURE)
}

session.get() で FlowFile を取得。そこから値を出したり処理したりします。
ただ動かしてみたところ、渡す元の Processor の値が何も入っていなくても session.get() で受け取る FlowFile は null にはならない様子。
なら null の時のパターンは不要?とも思いましたが何かあっては困る上、参考にするものが少なく確信が得られない以上 null チェックは行うべきかなと。
ということで以下のようにしてテスト。

def flowFile = session.get()
flowFile = null
if(flowFile != null){
 // なんかの処理
 session.transfer(flowFile, REL_SUCCESS)
}
else {
 session.transfer(flowFile, REL_FAILURE)
}

するとおそらく else 処理が走ったと思われますが今度は以下のエラーが。
スクリーンショット 2018-10-15 23.30.16.png
私は英語がからっきしなので chrome 先生に翻訳してもらいましょう。
それが次。
スクリーンショット 2018-10-15 23.30.35.png
いろいろありますがわかるのは中段のこれ。

[null, class org.apache.nifi.processor.Relationship]

多分session.transfer(flowFile, REL_FAILURE)のことでしょうね。
そりゃ null じゃ動かないよなぁということで google 先生に尋ねてみると出てくるコードは下の感じ。

def flowFile = session.get()
if(flowFile == null) return
 // なんかの処理
 session.transfer(flowFile, REL_SUCCESS)

returnとな。ただ指示を出した上の人の言うところ、「例外で落ちた時、failuer にいってくれるのはいいんだけど一々エラーのマーク(下の通り)が出るの気になるからなんとかできない?」とのこと。
スクリーンショット 2018-10-15 23.37.54.png
右上のやつ(というか件数がやばいことに)

じゃあ確か、FlowFile 作れるのあったなーと思いやってみる。
def file = session.create()
が、うまくいかず。何か要素を入れる必要があるのかなと思いやってみるも駄目…っ!!
ちょーっとお手上げだなーと思っていたところ家で調べていたら以下の記事が。
https://stackoverflow.com/questions/44189181/apache-nifi-flowfilehandlingexception-when-transfer-flowfile-in-custom-processo
エラーの内容はちょっと違いますが要約しますと、session.transfer() の時の FlowFile がsession.get()で呼び出したもの以外を使っているからエラーが起きてますよ、という内容。
あれ、ということは session.create()も駄目じゃない?(そもそも実行したところクラスが違うっぽいのでそういう問題でもないかも)

ということで何故みんな揃って null チェック後は return しているのか。
→そもそもそんなの想定されていないから executeGroovyScript と NiFi に後処理任せようぜ!
…ということかなと。
実際想定されないものみたいですし、それはそれでさっさと return してログを見ようぜってことですかね。

英語が駄目だと書いたとおり、記事内の stackoverflow も chrome 翻訳ですし、受け取り方が間違えているなどありましたらコメントいただけると幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0