ESB Mule を使った標準入出力

オープンソース ESB ツール Mule の基本的な使い方を記述しておく。

使用した環境は以下の通り。

使い方としては、XML でサービスの構成を記述し、mule コマンドでサーバーを起動するようになっており、OSGi ベースになる前の ServiceMix と同じ。

ただし、mule コマンドで自作の Java クラス等を使用する場合、CLASSPATH の代わりに環境変数 MULE_LIB を使用する点に注意が必要。(CLASSPATH に設定していても mule コマンド実行時にロードされない模様)


今回は、以下の手順でサンプルを作成した。

  1. Mule 構成ファイル作成
  2. 処理コンポーネント作成
  3. 実行

Mule 構成ファイル作成

Mule は基本的に以下のような構成でサービスを定義していけばよいので、比較的分かり易くなっている。ちなみに inbound や outbound には複数の定義が記述できる。

受信(inbound)-> 処理 -> 送信(outbound)

今回は、標準入力から受け取った文字列を自作のコンポーネントで加工し、標準出力に出力するようなサンプルを作成してみる。

まず、標準入出力を使用するために stdio の XML Schema 定義を読み込み設定を行って、 inbound や outbound で標準入出力へのエンドポイント定義を行う。stdio:connector では標準入力を促すためのメッセージを設定している。

なお、Mule の構成ファイルは、手書きするより Eclipse プラグインの Mule IDE を使った方が楽。(使用するコネクタ等をチェックボックスで指定して雛形を作ってくれる等)

mule-config.xml ファイル
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.2"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:stdio="http://www.mulesource.org/schema/mule/stdio/2.2"
      xsi:schemaLocation="
          http://www.mulesource.org/schema/mule/core/2.2 http://www.mulesource.org/schema/mule/core/2.2/mule.xsd
          http://www.mulesource.org/schema/mule/stdio/2.2 http://www.mulesource.org/schema/mule/stdio/2.2/mule-stdio.xsd">

    <!-- 入力を促すメッセージの設定 -->
    <stdio:connector name="StdioSetting" promptMessage="Please enter something: " />

    <model name="helloSample">
        <service name="HelloUMO">
            <inbound>
                <!-- 標準入力からの受信設定 -->
                <stdio:inbound-endpoint system="IN"  />
            </inbound>

            <component class="fits.sample.Hello" />

            <outbound>
                <pass-through-router>
                    <!-- 標準出力への出力設定 -->
                    <stdio:outbound-endpoint system="OUT" />
                </pass-through-router>
            </outbound>
        </service>
    </model>
</mule>

なお、コンポーネント定義でメソッドを指定しなくても、適切な public メソッドが実行されるようになっているが、実行対象のメソッドが複数あって限定できないような場合には、以下のように method-entry-point-resolver 要素を使って明示的に指定してやらなければならない。

メソッドを明示的に指定する場合の component の記述例
<component class="fits.sample.Hello">
    <method-entry-point-resolver>
        <include-entry-point method="helloMessage" />
    </method-entry-point-resolver>
</component>

処理コンポーネント作成

処理コンポーネントは POJO で記述することができる。
今回は標準入力からの文字列を受け取って加工した文字列を返すだけなので、String を引数と戻り値に持つ public メソッドを定義した POJO を作成。

Hello.java
package fits.sample;

public class Hello {
    public String helloMessage(String name) {
        return "Hello " + name + "!";
    }
}

実行

事前準備として、環境変数 MULE_HOME に Mule のホームディレクトリのパスを設定し、環境変数 PATH に %MULE_HOME%\bin を追加しておく。

mule コマンドに -config オプションと Mule 構成ファイルを指定するだけで MuleServer が起動する。(初回起動時はライセンス云々が表示されるが、画面の指示に従って進めればよい)停止させるときは Ctrl + C キー。

なお、自作の Java クラスを使用する場合は mule コマンドを実行する前に、環境変数 MULE_LIB にパスを設定しておく。(CLASSPATH に設定しても無駄)

実行例

以下のようなファイル構成になっているディレクトリで

  • conf\mule-config.xml
  • classes\fits\sample\Hello.class

次のようにコマンドを実行する。

>set MULE_LIB=classes
>mule -config mule-config.xml

MuleServer の起動ログが出力された後に Please enter somthing: が表示されるので、任意の文字を入力して Enter キーを押すと処理結果が出力される。

・・・
Please enter something:
fits
・・・
Hello fits!
・・・