はじめに
今回はマジで備忘録です。
が、だいぶ悩んだのでメモ書きとして残しておきます。
とはいえど、もう少し時間が経ってドキュメントが揃ってきたら大したことではないので不要になるでしょうが…
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 処理が走ったと思われますが今度は以下のエラーが。
私は英語がからっきしなので chrome 先生に翻訳してもらいましょう。
それが次。
いろいろありますがわかるのは中段のこれ。
[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 にいってくれるのはいいんだけど一々エラーのマーク(下の通り)が出るの気になるからなんとかできない?」とのこと。
右上のやつ(というか件数がやばいことに)
じゃあ確か、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 翻訳ですし、受け取り方が間違えているなどありましたらコメントいただけると幸いです。