Mavenを利用したMuleアプリケーションの開発手順を紹介します。

事前に次の環境が構築されていることを前提とします。

  • Java SE 1.5以上
  • Apache Maven 2以上
  • インターネットに接続できる環境

Mavenの設定

MavenでMuleアプリケーションを作成するには、Mavenのarchetype (project wizard)を利用します。Mavenのarchetypeを利用するには、Mavenのsettings.xml(通常はホームディレクトリの.m2/に作成する)に次の設定を追加します。

~/.m2/settings.xml
<settings>
  ...
  <pluginGroups>
    <pluginGroup>org.mule.tools</pluginGroup>
  </pluginGroups>
  ...
</settings>

プロジェクトの作成

次のコマンドを実行すると、MuleアプリケーションのMavenプロジェクトが作成されます。

$ mvn mule-project-archetype:create -DartifactId=HelloApp -DmuleVersion=3.1.2

このプロジェクトの作成は対話形式で行われ、次のポイントで入力を求められますが、ひとまずデフォルト値でよいでしょう。

  • [INFO] description:
  • [INFO] muleVersion:
  • [INFO] package:
  • [INFO] transports:
  • [INFO] modules:

正常にプロジェクトが作成されると「[INFO] BUILD SUCCESS」を含むテキストが画面に表示されます。

プロジェクト作成の際に実行したコマンドに含まれる -D〜 は、プロジェクトを作成する際のパラメータを定義しています。次に代表的なパラメータについて補足します。

  • artifactId
    必須です。MavenプロジェクトのArtifact IDを定義します。
  • muleVersion
    必須です。Mule ESBのバージョンを定義します。
  • description [Dedault: ]
    Mavenプロジェクトの概要説明を定義します。
  • package [Dedault: ]
    ベースになるパッケージを定義します。MavenプロジェクトのGroup IDになるのでちゃんと定義した方が良いでしょう。
    e.g. com/company/mule/apps
  • transports [Dedault: file,http,jdbc,jms,vm]
    Muleで利用するトランスポートを次から選択して指定します。分からなければ、デフォルトでOKです。
    ajax, ejb, file, ftp, http, https, imap, imaps, jbpm, jdbc, jetty, jetty-ssl, jms, jnp, multicast, pop3, pop3s, quartz, rmi, servlet, smtp, smtps, ssl, tls, stdio, tcp, udp, vm, xmpp
  • modules [default: client,cxf,management,scripting,sxc,xml]
    Muleで利用するモジュールを次から選択して指定します。分からなければ、デフォルトでOKです。
    acegi, annotations, atom, boot, builders, client, cxf, guice, ibeans, jaas, jbossts, jersey, json, management, ognl, pgp, rss, scripting, spring-extras, spring-security, sxc, ws, xml
  • interactive [default: true]
    MuleアプリケーションのMavenプロジェクトの作成時に、対話形式で作成するかどうかを定義します。対話形式での定義の変更が必要でなければ、falseで定義すると良いでしょう。

プロジェクトのビルド

Mavenプロジェクトをビルドするには、プロジェクトディレクトリに移動し、次のコマンドを実行します。

$ mvn package

ビルドの際、テストの実行を意図的にスキップしたい場合は、次のように実行します。

$ mvn -DskipTests package
ビルド時にテストで失敗する場合は、プロジェクト内の次のファイル中の<vm:outbound-endpoint>をコメントアウトして再実行して下さい。
src/test/resources/helloapp-functional-test-config.xml
<mule>
  ...
  <!--
    TODO: You can define a test configuration here then from the HelloTestCase you can fire events into
    Mule (using the MuleClient) and then assert the results.
    -->
  <flow name="main">
    <vm:inbound-endpoint path="in" exchange-pattern="request-response"/>
    <!-- TODO add your service component here. This can also be a Spring bean using <spring-object bean="name"/> -->
    <test:component appendString=" Received"/>
    
    <vm:outbound-endpoint path="out"/><!-- ここをコメントアウトする -->
  </flow>
</mule>
ツールのbugっぽいが、実際にはこのファイルをそのまま使うことはまずないと思われるので問題は無いハズ・・・。雰囲気だけ味わって下さい ^^;

Muleアプリケーションのデプロイ

プロジェクトのビルドを行うことで、targetディレクトリにZIPファイルが作成されます。Muleを開始している状態で、このZIPファイルを$MULE_HOME/appsディレクトリにコピーすることで、Muleアプリケーションをデプロイすることが出来ます。または、次のコマンドでもデプロイすることが出来ます。

$ mvn install
mvn installでデプロイするには、Mule ESBのインストール先のディレクトリを環境変数(MULE_HOME)としてあらかじめ定義しておく必要があります。


以前、Mule ESBのExample(mule-example-echo)をMule ESB上で実行する方法を紹介しましたが、いくつもあるExampleを1つ1つ実行するのは面倒です。今回はMule ESB内に標準で用意されているランチャーアプリケーションを紹介します。

ランチャーアプリケーションを実行する

Mule ESBを開始し、すべてのExampleを確認するには、次の手順でランチャーアプリケーションを実行します。

UNIX, Mac

$ <Mule Installation Directory>/bin/mule_examples

Windows

<Mule Installation Directory>\bin\mule_examples.bat

Exampleのデプロイが全て完了すると標準Webブラウザでランチャーアプリケーション(http://localhost:18082/examples/)が表示されます。

ランチャーアプリケーションの説明

Webブラウザからhttp://localhost:18082/examples/へアクセスするとランチャーアプリケーションにアクセスすることが出来ます。丁度、画面の左側にExampleの一覧があり、その一覧の中からExampleを選択することでそれぞれのExampleの確認が出来ます。

Example Launcherの起動画面

また選択したExample毎に次の3つを確認することが出来ます。

Overview

Exampleの概要を確認することが出来ます。

Example Launcher-Overview

Source

Exampleのソース(Mule ESBの定義ファイル)の内容を確認することが出来ます。

Example Launcher-Source

Run it

Exampleを実際に実行して動作を確認することが出来ます。

Example Launcher - Run it

Exampleのアンデプロイ

一度、Mule ESBにアプリケーションをデプロイするとMule ESBを開始する度にアプリケーションは実行され続けます。ランチャーアプリケーションは全てのExampleをMule ESBにデプロイするので、確認が終わると必要に応じてアンデプロイします。Mule ESBでは、アプリケーションのデプロイが成功するとアプリケーション毎のアンカーファイル(*-anchor.txt)を作成します。Mule ESBが開始している状態で、アンカーファイルを削除するとアプリケーションのアンデプロイを行うことが出来ます。

次の手順で、ランチャーアプリケーションでデプロイしたアプリケーションを全てアンデプロイすることが出来ます。

UNIX, Mac

$ rm <Mule Installation Directory>/apps/mule-example-*-anchor.txt

Windows

del <Mule Installation Directory>\apps\mule-example-*-anchor.txt

Mule ESBの停止

開始したMule ESBを停止するには、次の手順で行います。

UNIX, Mac

$ <Mule Installation Directory>/bin/mule stop

Windows

<Mule Installation Directory>\bin\mule.bat stop


Apache CXFのJAX-WS動的Webサービス・クライアントの利用方法を紹介します。

CXFについて初めての方は、次の記事を参考にして下さい。

...continue reading Apache CXFのJAX-WS動的Webサービス・クライアントを利用する


Java6では正式にクロージャはサポートされていませんが、内部クラスを利用して少し工夫すれば実現することができます。クロージャを実現するには、次のポイントを考慮する必要があります。

  • 内部クラスから外部の変数の値を参照・変更できる必要がある
  • 内部クラスから外部の変数の値を参照するには、その変数はfinalで宣言する必要がある
  • 変数をfinalで宣言してしまうと値の変更ができないため、オブジェクトで変数をラップする必要がある

クロージャのサンプルとして、Go言語のフィボナッチ数列のサンプルコードをJava言語で表現してみました。

Go(関数のみ抜粋)

// fib returns a function that returns
// successive Fibonacci numbers.
func fib() func() int {
	a, b := 0, 1
	// ↓これがクロージャ
	return func() int {
		a, b = b, a+b
		return b
	}
}

Java

public class Fibonacci {
	public static void main(String[] args) {
		Fibonacci fib = new Fibonacci();
		Func<Integer> f = fib.newFibonacci();
		println(f.call(), f.call(), f.call(), f.call(), f.call(), f.call(), f.call(), f.call(), f.call());
	}
	
	private static void println(Integer ...integers) {
		for(Integer i : integers) {
			System.out.print(i);
			System.out.print(" ");
		}
	}

	private class IntHolder {
		public int value;
		public IntHolder(int value) {
			this.value = value;
		}
	}
	
	public interface Func<R> {
		R call();
	}
	
	public Func<Integer> newFibonacci() {
		// インナークラスからの変数の参照はfinalのみ許可される。
		// インナークラスから値の更新を行えるようにオブジェクトでラップする。
		final IntHolder a = new IntHolder(0);
		final IntHolder b = new IntHolder(1);
		// ↓これがクロージャ
		return new Func<Integer>() {
			@Override
			public Integer call() {
				int fib = a.value + b.value;
				a.value = b.value;
				b.value = fib;
				return fib;
			}
		};
	}
}

クロージャをサポートしている他の言語と比べると少し面倒ですね・・・

参考

クロージャ - Wikipedia
いまさらだけど、Java言語にはクロージャーがない
Re: いまさらだけど、Java言語にはクロージャーがない


Apache CXFとSpring Frameworkを用いたJAX-RS仕様に準拠したWebサービス開発について紹介します。

なお、ここで紹介するソースコード例は、筆者環境の都合上、次の環境を前提とします。

  • Java SE6
  • Apache CXF 2.3.3
  • Spring Framework 3.0.5
  • Apache maven 3.0(jetty plugin等を利用)

また、JAX-RS仕様やApache CXFについては、wikiにまとめてありますので、詳細についてはそちらを参照下さい。

...continue reading Apache CXF+SpringによるWebサービス開発(JAX-RS編)