10
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Talend入門 (10) ~エラーハンドリング~

Last updated at Posted at 2019-11-18

##全体の目的
Talendの超簡単なサンプルジョブを作成して,ETLジョブ開発に必要なスキルを習得することが目的です。

##対象者
ETL / EAI技術者

##環境

使用環境 バージョン
OS Windows10
Talend 7.1.1

##サンプル一覧
以下の順番で習得していきます

# 内容
1 はじめてのTalend
2 ファイルI/O
3 データベースI/O
4 tMap
5 イテレータ
6 メタデータ
7 Context変数
8 Global Map
9 tHashInput/tHashOutput
10 エラーハンドリング(今回)
11 ロギング
12 子ジョブ(ジョブのネスト)
13-1 設定ファイル読み込みオリジナル版
13-2 設定ファイル読み込みコンポ版
14 tJava

サンプルコード(Talendプロジェクトデータ)

##今回の目的
エラーハンドリングについて理解する。

##3種類のエラーハンドリング

Talendでは3種類のエラーハンドリングが可能です。

# 種類 説明
1 Java例外 JavaのExceptionをキャッチして対処する
2 [tDie]コンポーネント [tDie]による処理続行不可エラーをキャッチします。[tDie]は強制終了させたい場合に利用します。
3 [tWarn]コンポーネント [tWarn]によるワーニングをキャッチします。[tWarn]は後続処理を続行できます。

##サンプルプログラム概要
上記3種類の例外をキャッチするジョブを作り自由にエラーハンドリングができることを確認します。

[tLogCatcher]を利用したジョブ

それではサンプルジョブを作成していきましょう。
リポジトリの[ジョブ]を右クリックし[ジョブの作成]を選択します。
[名前]にerr_handlingと入力し[Finish]ボタンをクリックします。
GS000325.png

シンプルなFile出力処理の作成

[tRowGenerator]と[tFileOutputDelimited]を配置します。
GS000353.png

[tRowGenerator]コンポーネント上でダブルクリックし設定画面を開きます。
[+]ボタンを一度押下し、ダミーの1カラムだけ定義します。
GS000354.png

[tFileOutputDelimited]の出力先ファイル名を設定します。
このサンプルでは "C:/work/err_handling/out.csv" としました。
GS000355.png

ロウをつなぎます。
GS000356.png

ここまでで一度実行してみましょう。正常に処理されます。
GS000357.png

そのまま2度目の実行をしましょう。今度はエラーになるはずです。
GS000358.png
The particular file "C:\work\err_handling\out.csv" already exist.
このエラーは[tFileOutputDelimited]の出力モードが新規作成になっている為に出たものです。
この例外をしっかりと対処していきましょう。

例外をキャッチする処理の組み込み

[tLogCatcher]と[tMap]と[tLogRow]を配置します。
GS000359.png

[tLogCatcher]と[tMap]をロウでつなぎます。
GS000360.png

[tMap]コンポーネント上でダブルクリックし設定画面を開きます。
[+]でout1を作成します。
GS000361.png
GS000362.png

入力のカラムを全てout1へマッピングしOKで編集画面を閉じます。
GS000363.png

[tMap]上で右クリックし、out1を[tLogRow]につなぎます。
GS000363b.png
GS000364.png

[tLogRow]の出力表示モードは見やすくする為「縦に出力」を選んでおきましょう。
GS000365.png

それでは実行してみましょう。
先ほどのJava例外を[tLogCatcher]でキャッチし処理していることが確認できます。
GS000366.png

例外をコントロールする

ここまででJava例外を処理することはできるようにはなりました。
しかし、これでは全Exceptionをキャッチしているだけでコントロールしているとは言えませんので次はエラー処理を意識して実装してみましょう。

エラーを自分自身で制御するために[tDie]を配置します。
GS000367.png

[tRowGenerator]で右クリックし、サブジョブがエラーの場合を選び[tDie]につなぎます。
GS000367b.png
GS000368.png

停止メッセージとエラーコードは下記のように設定します。

設定項目 設定値
停止メッセージ エラーが発生しました
停止コード 99
GS000369.png

実行してみましょう。
[tDie]で発生させたエラーを[tLogCatcher]でキャッチし処理していることが確認できます。
終了コードは99で終了しています。
GS000370.png

[tDie]の内容を取得できていることが確認できます。
GS000371.png

ワーニングをコントロールする

[tLogCatcher]はエラーハンドリングとしてもう一つ[tWarn]をキャッチすることができます。
サンプルで見ていきましょう。まず[tWarn]を配置します。
GS000372.png

下記設定にします。

設定項目 設定値
警告メッセージ ファイルの書き出しに成功
コード 42
優先度 情報
GS000373.png

[tRowGenerator]で右クリックし、サブジョブがOKの場合を選び[tWarn]につなぎます。
GS000374.png

正常系を走らせるので[tFileOutputDelimited]でエラーにならないように追加のチェックを入れておきます。
GS000375.png

実行します。
[tLogCatcher]が呼び出されました。
GS000376.png

プライオリティ3は優先度で設定した情報を表しています。

ここで一つ気になることが、終了コードが0となっています。
実は[tWarn]のコードは後続処理で利用できるだけであって、ジョブの終了コードに設定されるわけではありません。

終了コードをコントロールする

例えば準正常の終了コードを0以外の値にするなど、終了コードのコントロールはよく使われます。
最後にTalendでの終了コード設定方法を説明します。

[tJava]を配置します。
GS000376b.png

[tWarn]からはサブジョブOKでつないだうえで下記コードを設定します。
errorCode = ((Integer)globalMap.get("tWarn_1_WARN_CODE"));
つまりは errorCode という変数を上書きすることで終了コードを制御できます。
GS000377.png

実行します。
[tWarn]で定義したコードでジョブを終了していることが確認できます。
GS000378.png

##まとめ
今回はTalendでのエラーハンドリングを確認しました。

※毎度のことですが、ほんのさわりの部分だけを解説していますのでぜひここから深掘りしてみてください。

お疲れ様でした。

##次回以降
次回はロギングをやっていきます。

10
2
2

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
10
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?