今回は、無事Talendジョブ実行⇒コンパイル通った!⇒いけいけーっ!⇒エラー…
となった場合に、どのようにデバッグしていくかをまとめていきます。
コンパイルでエラーとなった場合の対処はこちら
この記事の対象とするエラー
今回対象とするエラーというのは、下記のような画面のものです。
無事にコンパイルまで通って、実際にジョブが動き出している最中に、コンソール画面に赤字エラーが表示された場合が本記事の対象となります。
Talend起動時のエラーについては⇒【Talend Open Studio 入門01】開発環境の構築。Talendをインストールしよう
Talendコンパイル時エラーについては⇒【Talend】ジョブ実行時エラーのデバッグ方法(コンパイルエラー編)
実行時エラーが出た!どうすれば…
それでは、ここから具体的なデバッグを行っていきます。
デバッグ実行する
Talendには、2種類のデバッグ機能が用意されています。
トレースデバッグとJavaデバッグです。
ですが、正直なところ、トレースデバッグは意味ないです。あんまり有益な情報が得られないので、Javaデバッグします。
Javaデバッグの実行方法は、いつもTalendジョブ実行する「実行」タブの左側2項目目、「デバッグ実行(Debug Run)」を選択し、
Debugの中の「Trace Debug」の右にある下矢印ボタンをクリックして「Java Debug」に切り替え、「Java Debug」ボタンを押下することで起動できます。
ボタンを押下すると、パースペクティブビューで開きますか?みたいなポップアップが出ますが、とりあえずYesを選んでおきます。
すると、ゴリゴリのJavaデバッグ画面が開きます。
この画面で、該当エラーを吐く箇所を見つけます。
ちなみに、元のデザイナ画面に戻るためには、右上の「>>」ボタンを押下して、「Integration」ボタンを押せばokです。
エラーコンポーネントの物理名を確認する
一旦デザイナ画面に戻ります。
一度エラーを出すと、デザイナ画面でコンポーネントが赤く表示されているはずです。
今回の場合は、一番最初の画像のtMap(編集)が赤枠表示されていますので、このコンポーネントを選択し、コンポーネントの物理名を確認しておきます。
エラーを吐いているtMapの物理名は、”tMap_2″と分かりました。
エラーコンポーネントのコードを探す
エラーコンポーネントの物理名が特定できたら、デバッグ実行してJavaデバッグ画面に移動します。
そして、先程のエラーコンポーネント物理名でコードを検索します。
コンポーネント名で検索すると、そのコンポーネントの挙動開始っぽいコード部が見つかると思います。
今回の例ですと、上記画像のように、”tMap_2 begin | start”とのコメントがある部分にヒットしました。
ブレークポイントを張る
このあたりでブレークポイントを張ります。
ブレークポイントの張り方は、上記画像の赤線部の所にマウスカーソルを持って行って右クリック⇒ブレークポイントの切り替え(Toggle Breakpoint)をします。
ジョブを再開してブレークポイントまで実行
ブレークポイントを張ったら、ジョブを再開、というか、実行します。
下図の右上にある、再開ボタン(緑再生ボタンと黄色い縦線みたいなアイコン)を押下します。
仕掛けたブレークポイントが見当はずれでなければ、無事さっきのコードまで実行されます。
この段階でもうエラー落ちしてしまう場合は、仕掛けたブレークポイントの場所が悪いので、もう一度探し直します。
ここからは頑張りが必要です。
1行ずつエラーで落ちる箇所まで実行していきます。
明らかに落ちないだろうな…というコード部分までスクロールして、ブレークポイントを張って実行していってももちろんokです。
1行ずつ実行はF5(ステップイン)又はAlt+F6(ステップオーバー)です。
基本はAlt+F6でいいかと。
慣れてきたら、1行ずつ実行では一生終わらないので、経験勘でブレークポイント張る⇒一度に実行⇒次のブレークポイントを見つけて…と実行していきます。
エラー箇所、特定される
という感じで、頑張ってエラー行を特定します。
その行を踏んだらExceptionルートに入る箇所がエラー行です(当たり前か)。
今回はこのコードを踏むとエラールートに入りました。
tMapのout1側に値をセットするための一時変数の計算を行う部分です。
[java]row1.SUURYO * row1.TANKA[/java]で落ちるようです。
という訳で、値を見てみると、SUURYOがNULLとのことでした。
ま、まさか…入力データが悪いパターンの奴では!
はい。数値が入ってくると想定した部分が空欄だったのでNULLとなってNULL Pointer Exceptionということだったのでしょうね。はいはい。
再実行してエラーにならないことを確認
本来は、null判定を入れておくか、stringで受け取ってparse失敗しないか、とかを確認するように修正するべきでしょうが、今回はサンプルなんでデータを直して終了です。
正常にジョブ実行されることが確認できました。
おわりに
エラーメッセージとエラーコンポーネントから、「あぁ、たぶんここが悪いだろうな」と一発で分かる場合は良いんですが、全く見当が付かずに落ちてしまった場合は、Javaデバッガで頑張って探していくしか…ないという残念な結果となりました。
後で記事を書く予定ですが、エラーキャッチの処理をTalendで組んでおけば、エラー箇所の特定がより分かり易くなりますので、そういったジョブを作ることを心がけましょう。はい。
今回は以上です!