[Talend Open Studio Data Integration] tContextLoad を使って動的な設定値を読み込む方法と、tContextDump で設定値を確認する方法
Context とは何か?
Talend Open Studio Data Integration では、コンテキスト (Context) という機能が存在します。これを使うとテスト環境で動作しているジョブを本番環境に移行したりする時に、いちいちジョブを変更しなくても済むようになります。コンテキストとは、つまりジョブの実行時に読み込まれる、ユーザーが定義可能なパラメータです。つまりコンテキストを使うことで、テスト環境と本番環境での動作等(データベース接続先やサーバーの IP アドレス等)を動的に変更できるというものです。
以下は Talend by Example での説明です。
Context is something you need to understand early on in your Talend development. Getting it right from the start will save a lot of pain later; when you start deploying your Jobs to Test and Production, and will save you major re-writes later as the number of Jobs you have increases and maintenance gets more difficult.
Context describes the user-defined parameters that are passed to your Job at runtime. Context Variables are the values that may change as you promote your Job from Development, through to Test and Production. Values may also change as your environment changes, for example, passwords may change from time to time.例えばテスト環境では C:/test.csv というファイルを読み込むが、本番環境は Linux なので /opt/hoge.csv というファイルを読み込む必要がある場合を考えます。その場合、コンテキストを使わないと本番環境にジョブを配置する時に、毎回ジョブの設定を変更しなければならず苦痛です。
しかしコンテキストを使えば、FILENAME というコンテキストを定義しておいて、設定ファイル等の中でテスト環境の場合は C:/test.csv を使い、本番環境の場合は /opt/hoge.csv を使うように定義しておくと、ジョブを変更せずにとても簡単にジョブの動作を変更することが出来ます。
またコンテキストは一度読み込むと、読み込んだジョブ全体で利用できるようになり、ジョブ内のコンポーネント (部品) でコンテキストを利用できるようになります。
それではどのようにしてコンテキストを使うのか見ていきます。
tContextLoad コンポーネントとは?
tContextLoad コンポーネントとは、外部 (ファイルやデータベース等) から読み込んだ設定値をコンテキストに読み込むためのコンポーネントです。基本的にはキーと値のペアを読み込むもので、例えば FILENAME というキーに対して C:/test.csv という値の組み合わせを読み込みます。tContextLoad コンポーネントは読み込んだ値をコンテキストに設定してくれますので、それ以降は他のコンポーネントから読み込んだ値を参照できるようになります。
tContextDump コンポーネントとは?
tContextDump コンポーネントは、現在のコンテキストに設定された情報を外部に出力する機能を持っています。このコンポーネントを使うと、今現在コンテキストに設定されている、あるいはコンテキストに読み込まれた値が何なのか見ることが出来るようになります。つまりこれを使うと、コンテキストの値が何なのかトラブル発生時の調査やデバッグ目的に役立ちます。
tContextLoad を使ったサンプルアプリケーションを作ってみる
tContextLoad コンポーネントの動作を確認するため、サンプルアプリケーションを作成してみます。このアプリケーションではファイルから設定値を読み込んでコンテキストに値を読み込んでみます。コンポーネントの配置
tFileInputDelimited コンポーネントと tContextLoad コンポーネントを配置し、tFileInputDelimited から tContextLoad に接続します。これによりファイルから読み込んだ設定値を tConetxtLoad に読み込ませることが出来ます。設定ファイルの作成
また読み込むためのファイルも準備しておきます。C:/Talend/testdata/test.ini というファイルを次の内容で作成します。data_directory=C:/Talend/testdata input_filename=test.csv output_filename=result.csv
data_directory にはファイルを読み込んだり結果を出力したりするためのディレクトリ (フォルダ) を指定します。設定値は C:/Talend/testdata となります。"=" 記号でキーと値のペアを表現しています。
また input_filename には読み込むファイル名を、output_filename には結果を出力するファイル名を定義しています。
ファイルから設定値を読み込む設定
次に tFileInputDelimited コンポーネントの設定を行います。ファイル名部分には読み込むファイル名として、先ほど作成した C:/Talend/testdata/test.ini を指定します。また区切り文字 (Field Separator) には "=" を設定します。なお Talend では、設定値は全てダブルクォーテーションで囲む必要があります。
ジョブでコンテキストを定義しておく
ファイルから読み込むコンテキストに対する "キー" は、あらかじめジョブで定義しておく必要があります。読み込んだキーに対応するキーに、値が動的に読み込まれて設定されます。下の図の左下にある緑色のボタンを押して一つづつコンテキストを追加します。Name 列にそれぞれ以下のように名前をつけます。
- data_directory
- input_filename
- output_filename
これでファイルに定義したキーと、上の図で定義したコンテキスト名が一致しますので、値が適切に読み込まれて設定されるようになります。
ジョブを実行してみる
ここまでの時点でジョブを実行すると、次のように tFileInputDelimited コンポーネントによって3件のレコードが読み込まれて、tContextLoad コンポーネントに値が渡されているのが分かります。しかしこれだけでは本当に値が設定されたのか分かりませんので、このジョブに更に機能を追加していきます。
tContextDump コンポーネントを使って設定値を確認する
ここまで作成したジョブは設定値を読み込んで tContextLoad コンポーネントに値を渡しましたが、どんな設定値が読み込まれてコンテキストに設定されたのか確認する手段がありませんでした。そのような場合に tContextDump コンポーネントを使います。tContextDump コンポーネントを配置する
現在設定されているコンテキスト値を確認するため、ここまで作成したジョブに tContextDump コンポーネントと tLogRow コンポーネントを配置して tContextDump と tLogRow を接続します。tContextDump は設定値を出力するために、出力用のコンポーネントが必要ですので tLogRow を使います。そして tFileInputDelimited コンポーネントから "On Subjob OK" で接続しましょう。すると次のようになります。
ジョブを実行して tContextDump コンポーネントの出力を確認する
それではジョブを実行してみます。すると下の図のように処理が実行されているのが分かります。処理の流れは次の通りです。- tFileInputDelimited がファイルから3レコード読み込む
- 読み込まれたレコードは全て tContextLoad に値が渡されてコンテキストが設定される
- 次に tContextDump が実行され、設定されている3つの値を tLogRow に渡す
- 値を渡された tLogRow は画面にコンテキストに設定された情報を出力する
この結果、Talend のメッセージ出力欄には次のようにコンテキスト情報が出力されています。
ファイルから読み込まれた設定値がコンテキストに設定され、その情報が tContextDump コンポーネント経由で出力されています (上の図の赤枠部分)。これにより、正しくコンテキスト値が読み込まれて設定されていることが確認できます。
コンテキスト値を設定できましたので、今度はこの設定値を実際に利用してみましょう。
コンテキストの値を参照する
ここまでで読み込んだ設定値がコンテキストに設定されることが確認できましたので、今度はコンテキスト値を利用する方法を見ていきます。コンテキスト値を参照するコンポーネントを配置する
コンテキスト値を利用するために tFileInputDelimited を配置します。ここでは C:/Talend/testdata/test.csv というファイルの中身を読み込んで、そのまま別のファイルに出力します。C:/Talend/testdata/test.csv ファイルの中身は次の通りです。
123,456,789 ABC,DEF,GHI
tFileOutputDelimited は、コンテキストに設定された output_directory で指定されたディレクトリ (フォルダ) の中の、output_filename で指定されたファイル名にコンテキスト値を全部出力します。
ジョブの全体像は次の図のようになります。
コンテキスト値を参照するコンポーネント設定
それでは tFileInputDelimited (tFileInputDelimited_2) の設定を変更します。下の図にあるように、読み込むファイル名部分にコンテキスト名を記述します。ファイル名は context.data_directory + "/" + context.input_filename となります。コンテキストの値を参照する場合には必ず context.変数名 となりますので、今回の場合は context.data_directory と context.input_filename という名前です。
この設定により、ジョブの実行時にディレクトリ名 (フォルダ名) と入力ファイル名がコンテキストで設定された値に動的に置き換わります。またディレクトリ (フォルダ) とファイル名の区切り文字を設定するために + "/" + というように、Java の文法で文字列を結合しています。Java では + 記号が文字列連結という意味です。
これで読み込むファイル名を実行時に動的に変更できるようになりました。次に、同様にファイルを出力するために tFileOutputDelimited (tFileOutputDelimited_1) の設定も下の画像のように設定します。
ファイル名の設定値は context.data_directory + "/" + context.output_filename とします。
これにより実行時に動的に出力するファイル名が変化するようになります。このサンプルアプリケーションでは、C:/Talend/testdata/test.csv ファイルを読み込んで、C:/Talend/testdata/result.csv というファイルに内容をそのまま出力します。
ジョブを実行してみる
ジョブを実行すると、次のように実行結果が表示されています。C:/Talend/testdata/test.csv ファイルから2レコード読み込まれ、C:/Talend/testdata/result.csv ファイルに2レコード書き込まれているのが分かります。なお C:/Talend/testdata/test.ini ファイルの設定を変更することで、ジョブを再作成しなくても設定を動的に変更できます。