RubyからTalendのジョブを呼び出してみる

2015.08.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Talendでは作成した処理を「ジョブ」という単位で管理しています。このジョブはエクスポートしてjarファイルを作ることができ、外部のプログラムから呼び出すことができます。今回はRubyから呼び出してみました。

なお、以下の環境で行っています。

  • Mac OS
  • Talend 5.5.2
  • ruby 2.1.5

ジョブの作成〜Rubyからの呼び出し

ジョブの作成

今回作成したTalendのジョブは

  1. CSVファイルを読み込み
  2. 任意のカラムと新規のカラムを追加して
  3. 別のファイルに出力する

というものです。[Talend]CSVを読み込んでカラムを追加してCSVを出力するジョブ定義と同じ様なことを行ったと考えてください。

ジョブのスクリーンショットは以下のようになります。 call_talend_job_from_ruby_1

またCSVを呼び込む処理には「エラーで停止」にチェックを入れてあります。 call_talend_job_from_ruby_4

ジョブのエクスポート

上記のジョブをエクスポートします。Talendの開発環境上のリポジトリウィンドウ - [ジョブ] - [該当ジョブ]を右クリックし、[Build Job]を押してください。 call_talend_job_from_ruby_2
[Build Job]ウィンドウが表示されるので、真ん中あたりの「ZIPファイルの解凍」を選択して「終了」ボタンを押します。そうするとジョブを圧縮したzipファイルと、それを解凍したフォルダが作成されるはずです。
(ちなみに「ZIPファイルの解凍」は選択しなくても、後でOSのコマンドなどで解凍することも可能です。)

エクスポートしたジョブの中身

zipファイルを解凍したフォルダの直下に、.jar・.bat・.shファイルがあります。この.jarがジョブがビルドされて作成されたjarファイルです。.bat・.shはjarファイルを呼び出すためのもので、例えばMacやLinuxでは.shを叩くことでジョブが実行されます。(Windowsでは.batを叩けばジョブが動く筈ですが、今回は試していません。)

ジョブを起動するRuby

上で書いた通り.shを叩けばジョブが起動しますが、今回はRubyから動かすことにしました。以下のようになります。

require "open3"

DIR = Dir::pwd + "/EtlSample"

cmd = 'cd ' + DIR + ";"
cmd += 'ROOT_PATH=' + DIR + ";"
cmd += 'java -Xms256M -Xmx1024M -cp $ROOT_PATH/../lib/dom4j-1.6.1.jar:$ROOT_PATH/../lib/talend_file_enhanced_20070724.jar:$ROOT_PATH/../lib/talendcsv.jar:$ROOT_PATH:$ROOT_PATH/../lib/systemRoutines.jar::$ROOT_PATH/../lib/userRoutines.jar::.:$ROOT_PATH/etlsample_0_1.jar: callexternalappsample.etlsample_0_1.EtlSample --context=Default "$@" '

out, err, status = Open3.capture3(cmd)

puts "----- out -----"
puts out
puts "----- err -----"
puts err
puts "----- status -----"
puts status

.shに書かれているのと同じコマンドを、Open3.capture3()に渡して実行しています。コマンドの実行結果をputsで出力してみました。

実行結果

以下、上記のRubyを実行してジョブを動かした結果です。正常に終了した場合は以下のようになりました。

$ ruby EtlSample_run.rb
----- out -----

----- err -----

----- status -----
pid 4105 exit 0

Open3.capture3()の戻り値であるout、errには何も入っていないようです。statusにはプロセスのIDと、「exit 0」が返ってきました。今回は試していませんが、ジョブの中でtJavaを使い「Sysytem.out.println」で標準出力すると、その値がoutには入るようです。

次にエラーだった場合の結果です。読み込むファイルが存在しない状態にして、実行してみました。

$ ruby EtlSample_run.rb
----- out -----

----- err -----
Exception in component tFileInputDelimited_1
java.io.FileNotFoundException: /Users/xxxx/D/talend/yyyyy.csv (No such file or directory)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at callexternalappsample.etlsample_0_1.EtlSample.tFileInputDelimited_1Process(EtlSample.java:1150)
	at callexternalappsample.etlsample_0_1.EtlSample.runJobInTOS(EtlSample.java:2015)
	at callexternalappsample.etlsample_0_1.EtlSample.main(EtlSample.java:1896)
----- status -----
pid 4128 exit 1

errにはエラーの詳細が返ってきています。またstatusにはプロセスのIDと、「exit 1」が返ってきました。ということは、errとstatusとで実行結果が判定できると言えると思います。

まとめ

Talendで作成さたジョブを外部のプログラムから起動できることが確認できました。ということは、例えばETL処理はTalendで作成し、その起動はWebアプリケーションのブラウザから行う、といった実装もできることになります。Talendと他のプログラムの組み合わせには、何らかの可能性があるように思えます。