[Talend]ルーチンを利用してJavaのコードを書く

今回はTalendの機能の1つ「ルーチン」を紹介したいと思います。
2018.10.02

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

はじめに

こんにちは。DI部の大高です。

今回はTalendの機能の1つ「ルーチン」を紹介したいと思います。

前提条件

Talendのバージョンは「Talend Open Studio for Big Data」の「Version 7.0.1」で検証しています。

ルーチンについて

「ルーチン」を利用するとJavaのコードを書くことができ、記述したコードをTalendのジョブから呼び出すことが出来ます。

「ルーチン」についての説明はTalend Helpページのこちらに記載されています。

What are routines

では、具体的に以下で解説していきます。

ジョブの説明

今回は「ルーチン」の説明なので、ジョブとしては「tJava」から「ルーチン」に定義したクラスのコードを呼び出して処理結果を標準出力に表示するだけのジョブとなっています。

「ルーチン」の設定と作成

「ルーチン」は、画面左側の「リポジトリ」ビューから、「コード > ルーティン」の配下に作成します。(何故かここの翻訳は"ルーティン"になっていますね)
今回は「system」とは別に「user」フォルダを作成して、その配下にクラスを作成していくことにします。

「ルーティン」を右クリックして、「フォルダの作成」を選択します。

フォルダ名に「user」と入力して「Finish」をクリックします。

次に作成した「user」フォルダを右クリックして「ルーチンの作成」をクリックします。

ルーチンの「名前」、「目的」、「説明」を入力して「Finish」をクリックします。

作成されたルーチンを一旦開くと、このように初期テンプレートでクラスが作成されています。
これで「routines」パッケージ配下に「StringConverter」としてクラスが作成されました。この「routines」パッケージがジョブの中で呼び出すことが出来るパッケージとなります。

また、クラスの前のコメントで関数コメントの書き方が説明されています。実際に作成する場合には、この通りにコメントを書くと良いかと思います。

package routines;

/*
 * user specification: the function's comment should contain keys as follows: 1. write about the function's comment.but
 * it must be before the "{talendTypes}" key.
 * 
 * 2. {talendTypes} 's value must be talend Type, it is required . its value should be one of: String, char | Character,
 * long | Long, int | Integer, boolean | Boolean, byte | Byte, Date, double | Double, float | Float, Object, short |
 * Short
 * 
 * 3. {Category} define a category for the Function. it is required. its value is user-defined .
 * 
 * 4. {param} 's format is: {param} <type>[(<default value or closed list values>)] <name>[ : <comment>]
 * 
 * <type> 's value should be one of: string, int, list, double, object, boolean, long, char, date. <name>'s value is the
 * Function's parameter name. the {param} is optional. so if you the Function without the parameters. the {param} don't
 * added. you can have many parameters for the Function.
 * 
 * 5. {example} gives a example for the Function. it is optional.
 */
public class StringConverter {

    /**
     * helloExample: not return value, only print "hello" + message.
     * 
     * 
     * {talendTypes} String
     * 
     * {Category} User Defined
     * 
     * {param} string("world") input: The string need to be printed.
     * 
     * {example} helloExemple("world") # hello world !.
     */
    public static void helloExample(String message) {
        if (message == null) {
            message = "World"; //$NON-NLS-1$
        }
        System.out.println("Hello " + message + " !"); //$NON-NLS-1$ //$NON-NLS-2$
    }
}

今回は以下の記事と同じようにApache Commons LangWordUtils#capitalizeを利用して文字列を変換する処理を書きたいと思います。
※書いている途中で「Deprecated」であることに気付きましたが、このまま行きます…。

tJavaコンポーネントを利用してJavaのコードを直接書く | Developers.IO

まずは、ルーチンの中で今回利用したい外部ライブラリを利用できるように、ルーチンライブラリを設定します。

ルーチンを右クリックして「ルーチンライブラリの編集」をクリックします。

ライブラリを追加するので「New...」をクリックします。

ライブラリに追加したい「commons-lang3-3.6.jar」を指定して「OK」をクリックします。

追加されたことを確認して「Finish」をクリックします。

テンプレートのコードを全て消して、以下のように修正します。

package routines;

import org.apache.commons.lang3.text.WordUtils;

public class StringConverter {

    public static String capitalize(String input){
        return WordUtils.capitalize(input);
    }
}

これで「ルーチン」側の設定・作成は完了です。

「tJava」コンポーネントの設定

あとは「tJava」コンポーネントで設定したルーチンを呼び出すコードを記述します。前述した通り、routinesパッケージ内のクラスはそのまま呼び出せるのでクラス名とメソッド名(StringConverter.capitalize)を指定すれば普通に利用できます。

// Routineを利用する
String action = "mighty critical strike";
System.out.println(StringConverter.capitalize(action));

実行結果

設定は以上です。実際にこのジョブを実行すると以下のように出力されます。

[statistics] connecting to socket on port 4071
[statistics] connected
Mighty Critical Strike
[statistics] disconnected

「ルーチン」に定義した処理を「tJava」から呼び出せました!

まとめ

以上、「ルーチン」の紹介でした。

「ルーチン」を利用することでコードを一元管理することができるので、どうしてもJavaのコードで処理を書く必要がある場合には、「ルーチン」を利用すると良いかと思います。

それでは。