Mavenを使った、ServiceAssemblyとServiceUnitの構築

Mavenプロジェクトの作成

まずは、空のディレクトリを作成。

C:\apache-servicemix-3.3\examples\exampleCreateSU

次に、以下内容でpom.xmlを作成。

<?xml version="1.0" encoding="utf-8"?>
<project 
		xmlns="http://maven.apache.org/POM/4.0.0"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

	<modelVersion>4.0.0</modelVersion>
	<groupId>org.apache.servicemix.tutorial</groupId>
	<artifactId>parent</artifactId>
	<version>1.0-SNAPSHOT</version>
	<packaging>pom</packaging>
	<name>Tutorial</name>
	<url>http://servicemix.org</url>

</project>

pom.xmlのチェック

作成したら、該当ディレクトリでmavenを実行して、ビルドしてくれる。

C:\apache-servicemix-3.3\examples\exampleCreateSU>mvn install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Tutorial
[INFO]    task-segment: [install]
[INFO] ------------------------------------------------------------------------

(略)

[INFO] [install:install]
[INFO] Installing C:\apache-servicemix-3.3\examples\exampleCreateSU\target\pom-transformed.xml to C:\Users\teppei\.m2\repository\org\apache\servicemix
\tutorial\parent\1.0-SNAPSHOT\parent-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 minute 2 seconds
[INFO] Finished at: Wed Jun 03 20:11:47 JST 2009
[INFO] Final Memory: 8M/14M
[INFO] ------------------------------------------------------------------------

そして、SeriviceUnit作成に入る。

ServiceUnitプロジェクト作成のために、Maven雛形を使う。

ServiceMixは、ServiceUnitを作成するのに便利な、Maven雛形を提供しており、それを使ってServiceUnitプロジェクトを作成する。

雛形のGroupIDは、org.apache.servicemix.tooling になる。

以下のコマンドを実行して、tutorial-file-su という名前のServiceUnitを作成。

mvn archetype:create -DarchetypeArtifactId=servicemix-service-unit -DarchetypeGroupId=org.apache.servicemix.tooling -DartifactId=tutorial-file-su
C:\apache-servicemix-3.3\examples\exampleCreateSU>mvn archetype:create -DarchetypeArtifactId=servicemix-service-unit -DarchetypeGroupId=org.apache.ser
vicemix.tooling -DartifactId=tutorial-file-su
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Tutorial
[INFO]    task-segment: [archetype:create] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'.
[INFO] Setting property: velocimacro.messages.on => 'false'.
[INFO] Setting property: resource.loader => 'classpath'.
[INFO] Setting property: resource.manager.logwhenfound => 'false'.
[INFO] [archetype:create]
[WARNING] This goal is deprecated. Please use mvn archetype:generate instead
[INFO] Defaulting package to group ID: org.apache.servicemix.tutorial
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating OldArchetype: servicemix-service-unit:RELEASE
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: org.apache.servicemix.tutorial
[INFO] Parameter: packageName, Value: org.apache.servicemix.tutorial
[INFO] Parameter: basedir, Value: C:\apache-servicemix-3.3\examples\exampleCreateSU
[INFO] Parameter: package, Value: org.apache.servicemix.tutorial
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: artifactId, Value: tutorial-file-su
[WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 101,column 18] : ${servic
emix-version} is not a valid reference.
[INFO] ********************* End of debug info from resources from generated POM ***********************
[INFO] OldArchetype created in dir: C:\apache-servicemix-3.3\examples\exampleCreateSU\tutorial-file-su
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 second
[INFO] Finished at: Wed Jun 03 22:09:59 JST 2009
[INFO] Final Memory: 8M/15M
[INFO] ------------------------------------------------------------------------

最後に「BUILD SUCCESSFUL」と出ればOK。

それで、何が作成されたのだろうか。

C:
└apache-servicemix-3.3
	└examples
		└exampleCreateSU
			└tutorial-file-su
				├pom.xml
				└src
				 └main
					└resources

まず、ServiceUnitを作成するための、pom.xml が生成されている。
あと、\src\main\resourcesディレクトリが作成されているが、ここには、ServiceUnitの設定を定義する、xbean.xmlを作成する。

pom.xmlを設定する。

プロジェクト名を変更する。

ビルドアウトプットを少し図りやすくするために、生成された exampleCreateSU\tutorial-file-su\pom.xml の中で、プロジェクト名を変更する。

変更前

<name>A custom project</name>

変更後

<name>Tutorial :: File SU</name>
JBIコンポーネントへの依存性を追加する。

ServiceUnitは全て、特定のJBIコンポーネントに括りつく。そのJBIコンポーネントは、pom.xmlに単純に依存性を追加することによって、pom.xmlの中で特定する。ServiceMixのMavenツールは、他の面倒を見てくれる。この場合、servicemix-file(groupIdはorg.apache.servicemix)に依存性を追加する。pom.xmlファイルの中のプロパティとして、ServiceMixのVersionは特定されているので、をれを使いまわす。ここではJUnitを使わないので、dependenciesタグは以下の通りで充足する。

変更前

(略)
  </pluginRepositories>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <properties>
    <servicemix-version>3.2.2</servicemix-version>
  </properties>
</project>

変更後

(略)
  </pluginRepositories>
<!--
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
-->
  <dependencies>
    <dependency>
      <groupId>org.apache.servicemix</groupId>
        <artifactId>servicemix-file</artifactId>
        <version>${servicemix-version}</version>
      </dependency>
   </dependencies>
  <properties>
    <servicemix-version>3.2.2</servicemix-version>
  </properties>
</project>

xbean.xmlの設定

次に、新しいServiceUnitに対して、実際に何がしかのサービスを提供させるように設定させてやらなければならない。これは、exampleCreateSU\tutorial-file-su\src\main\resources配下に、xbean.xmlファイルを作成することで行う。以下のサンプルでは、二つの名前空間が定義されている。titleの接頭辞は、標準ファイル機能を指し示す名前空間を示しており、tut接頭辞は、後で定義される全てのサービスで使われる名前空間となる。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:file="http://servicemix.apache.org/file/1.0"
        xmlns:tut="urn:servicemix:tutorial">
  <!-- add the sender endpoint here -->
  <!-- add the poller endpoint here -->
</beans>
senderのendpointを定義

ファイル送信機能は、ローカルファイルシステムにファイルを書き込むのに使うことができる。以下のXMLで、ファイル送付のendpointを作成することができる。

  <file:sender service="tut:file" 
             endpoint="sender"
             directory="file:///C:/apache-servicemix-3.3/examples/exampleCreateSU/sender" />
pollerのendpointを定義

次に以下のようにpollerのendpointを定義する。これにより、senderのendpointにファイルを送ることができる。

  <file:poller service="tut:file" 
             endpoint="poller"
             file="file:///C:/apache-servicemix-3.3/examples/exampleCreateSU/poller" 
             targetService="tut:file"
             targetEndpoint="sender"/>

ServiceAssemblyの作成

ServiceUnitを作るのに、Maven雛形を利用したのと同じように、servicemix-service-assemblyというMaven雛形を使って、ServiceAssemblyを作成する。

親pom.xmlが配置されているディレクトリ(ここではC:\apache-servicemix-3.3\examples\exampleCreateSU)で、以下コマンドを実行。

mvn archetype:create -DarchetypeArtifactId=servicemix-service-assembly -DarchetypeGroupId=org.apache.servicemix.tooling -DartifactId=tutorial-sa

以下実行結果。

C:\apache-servicemix-3.3\examples\exampleCreateSU>mvn archetype:create -DarchetypeArtifactId=servicemix-service-assembly -DarchetypeGroupId=org.apache
.servicemix.tooling -DartifactId=tutorial-sa
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   Tutorial
[INFO]   Tutorial :: File SU
[INFO] Searching repository for plugin with prefix: 'archetype'.
Downloading: http://people.apache.org/repo/m2-ibiblio-rsync-repository/org/apache/servicemix/tooling/jbi-maven-plugin/3.2.2/jbi-maven-plugin-3.2.2.pom

(略)

[INFO] ********************* End of debug info from resources from generated POM ***********************
[INFO] OldArchetype created in dir: C:\apache-servicemix-3.3\examples\exampleCreateSU\tutorial-sa
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12 seconds
[INFO] Finished at: Thu Jun 04 11:52:39 JST 2009
[INFO] Final Memory: 10M/19M
[INFO] ------------------------------------------------------------------------
C:\apache-servicemix-3.3\examples\exampleCreateSU>

これで、新しいServiceUnitプロジェクトが、exampleCreateSU\tutorial-saディレクトリに作成された。

pom.xmlの編集

プロジェクト名の修正

再度、ビルド出力をきれいにするために、プロジェクト名を修正。

変更前

  <name>A custom project</name>

変更後

  <name>Tutorial :: SA</name>
ServiceAssemblyにServiceUnitを追加

Mavenツールは、ServiceAssemblyのpom.xmlに正しく依存関係を加えれば、自動的にSerivceUnitをServiceAssemblyに追加してくれる。groupId、artifactId、versionだけを使う。

変更前

<?xml version="1.0" encoding="UTF-8"?>
<project>
 ・・・
 (略)
 ・・・
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <properties>
    <servicemix-version>3.2.2</servicemix-version>
  </properties>
</project>

変更後

<?xml version="1.0" encoding="UTF-8"?>
<project>
 ・・・
 (略)
 ・・・
  <!--
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  -->
  <dependencies>
    <dependency>
      <groupId>org.apache.servicemix.tutorial</groupId>
      <artifactId>tutorial-file-su</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>
  <properties>
    <servicemix-version>3.2.2</servicemix-version>
  </properties>
</project>

全ビルドんのためにMavenを実行する。

C:\apache-servicemix-3.3\examples\exampleCreateSU>mvn install


(略)

[INFO]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] Tutorial .............................................. SUCCESS [2.012s]
[INFO] Tutorial :: File SU ................................... SUCCESS [5:58.940s]
[INFO] Tutorial :: SA ........................................ SUCCESS [0.500s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6 minutes 1 second
[INFO] Finished at: Thu Jun 04 12:15:57 JST 2009
[INFO] Final Memory: 22M/41M
[INFO] ------------------------------------------------------------------------

これで、ServiceAssemblyをデプロイする準備ができた。

ServiceAssemblyをデプロイする。

ホットデプロイを利用

tutorial-saディレクトリに移動し、mvn install コマンドを実行

C:\apache-servicemix-3.3\examples\exampleCreateSU\tutorial-sa>mvn install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Tutorial :: SA
[INFO]    task-segment: [install]
[INFO] ------------------------------------------------------------------------

(略)

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12 seconds
[INFO] Finished at: Thu Jun 04 13:27:40 JST 2009
[INFO] Final Memory: 18M/33M
[INFO] ------------------------------------------------------------------------

これでZipファイルが・・・・・できない orz

JBI Mavenプラグインを利用

作業を始める前に、ServiceMixが起動していることを確認。

以下コマンドを実行

mvn jbi:projectDeploy
C:\apache-servicemix-3.3\examples\exampleCreateSU\tutorial-sa>mvn jbi:projectDeploy
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Tutorial :: SA
[INFO]    task-segment: [jbi:projectDeploy]
[INFO] ------------------------------------------------------------------------

(略)

[INFO] ------------------ Deployment Analysis --------------------
[INFO] Tutorial :: SA has 2 child dependencies
[INFO]  - jbi-service-assembly : C:\Users\teppei\.m2\repository\org\apache\servicemix\tutorial\tutorial-sa\1.0-SNAPSHOT\tutorial-sa-1.0-SNAPSHOT.zip
[INFO]  - jbi-component : C:\Users\teppei\.m2\repository\org\apache\servicemix\servicemix-file\3.2.2\servicemix-file-3.2.2-installer.zip
[INFO]  - jbi-shared-library : C:\Users\teppei\.m2\repository\org\apache\servicemix\servicemix-shared\3.2.2\servicemix-shared-3.2.2-installer.zip
[INFO] -----------------------------------------------------------
[INFO] servicemix-shared is deployed
[INFO] servicemix-file is deployed
[INFO] tutorial-sa is not deployed
[INFO] Deploying jbi-service-assembly from C:\Users\teppei\.m2\repository\org\apache\servicemix\tutorial\tutorial-sa\1.0-SNAPSHOT\tutorial-sa-1.0-SNAP
SHOT.zip
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 32 seconds
[INFO] Finished at: Thu Jun 04 14:25:55 JST 2009
[INFO] Final Memory: 10M/22M
[INFO] ------------------------------------------------------------------------
C:\apache-servicemix-3.3\examples\exampleCreateSU\tutorial-sa>

これでデプロイ完了。

動かしてみる

examples\exampleCreateSU\poller に、何かXMLファイルを配置すると、

f:id:teppei-studio:20090604144120j:image

数秒外に、examples\exampleCreateSU\sender に移動するようになる。

f:id:teppei-studio:20090604144121j:image

以上