SCA の簡単なサンプルを作成

Tuscany 0.9 でスタンドアロン実行可能な簡単なサンプルを作成する。

手順は以下の通り。

  1. サービスの作成
  2. アセンブリモデルの構成ファイル作成
  3. クライアントの作成
  4. コンパイルと実行

サービスの作成

サービスインターフェースとその実装クラスを Java で記述。

package simple;

//サービスインターフェース
public interface SimpleService {
    String getMessage(String msg);
}

サービスの実装クラスには通常 @Service アノテーションを使うようだが、Tuscany のスタンドアロン実行で使うにはアノテーションは不要だった。(SCA 1.0 の仕様を確認していないので、仕様上正しいかどうかは不明)

SimpleServiceImpl.java
package simple;

//サービスの実装クラス
public class SimpleServiceImpl implements SimpleService {
    public String getMessage(String msg) {
        return msg + ":" + this;
    }
}

なお、サービス実装クラスのインスタンスの扱いは、@Scope アノテーションで指定することが可能。指定しないと STATELESS 扱いになりリクエスト毎に異なるインスタンスが使用される。

Scope アノテーションで指定できる値は以下の通り。

アセンブリモデルの構成ファイル作成

コンポジットの定義ファイルを作成する。

Simple.composite ファイル
<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="Simple">
  <component name="SimpleServiceComponent">
    <implementation.java class="simple.SimpleServiceImpl"/>
  </component>
</composite>

クライアントの作成

package simple;

import org.apache.tuscany.sca.host.embedded.SCADomain;

public class SimpleClient {

    public static void main(String[] args) {
        
        SCADomain scad = SCADomain.newInstance("Simple.composite");

        SimpleService service = scad.getService(SimpleService.class, "SimpleServiceComponent");

        System.out.println(service.getMessage("a1"));
        System.out.println(service.getMessage("a2"));

        scad.close();
    }
}

コンパイルと実行

コンパイルと実行時には、Tuscany のインストール先の lib ディレクトリ内の tuscany-sca-manifest.jar ファイルをクラスパスに設定する。

Ant 用のビルドファイル build.xml は以下のように記述した

<?xml version="1.0" encoding="Shift_JIS" ?>
<project name="" default="compile" basedir=".">
    <property environment="env" />

    <property name="src.dir" value="src" />
    <property name="resources.dir" value="resources" />
    <property name="dest.dir" value="dest" />
    <property name="classes.dir" value="${dest.dir}/classes" />
    <property name="dest.file" value="${dest.dir}/simple.jar" />
    <property name="main.class" value="simple.SimpleClient" />

    <path id="project.classpath">
        <fileset dir="${env.TUSCANY_HOME}">
            <include name="**/tuscany-sca-manifest.jar" />
        </fileset>
    </path>
    <target name="compile">
        <mkdir dir="${classes.dir}" />
        <javac srcdir="${src.dir}" destdir="${classes.dir}">
            <classpath refid="project.classpath" />
            <include name="**/*.java" />
        </javac>
    </target>
    <target name="package" depends="compile">
        <jar destfile="${dest.file}">
            <fileset dir="${classes.dir}" />
            <fileset dir="${resources.dir}" />
            <manifest>
                <attribute name="Main-Class" value="${main.class}" />
            </manifest>
        </jar>
    </target>
    <target name="run" depends="package">
        <java classname="${main.class}" fork="yes">
            <classpath>
                <path location="${dest.file}" />
                <path refid="project.classpath" />
            </classpath>
        </java>
    </target>
    <target name="clean">
        <delete dir="${dest.dir}" />
    </target>
</project>

ビルドで生成したファイルの構成は以下の通り

simple.jar ファイル
  • simple ディレクトリ
    • SimpleClient.class
    • SimpleService.class
    • SimpleServiceImpl.class
  • Simple.composite
実行結果
>ant run
Buildfile: build.xml

compile:

package:

run:
     [java] a1:simple.SimpleServiceImpl@bc8e1e
     [java] a2:simple.SimpleServiceImpl@11671b2

BUILD SUCCESSFUL
Total time: 8 seconds

なお、実行は J2SE 5.0 の環境を使う必要があるようで、JavaSE 6.0 では下のようなエラーが発生した。

run:
     [java] Exception in thread "main" javax.xml.stream.FactoryConfigurationErro
r: Provider javax.xml.stream.XMLInputFactory could not be instantiated: java.lan
g.InstantiationException
     [java]     at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.
java:158)
     [java]     at org.apache.tuscany.sca.contribution.service.impl.Contribution
RepositoryImpl.<init>(ContributionRepositoryImpl.java:88)
     [java]     at org.apache.tuscany.sca.host.embedded.impl.ReallySmallRuntimeB
uilder.createContributionService(ReallySmallRuntimeBuilder.java:184)
     [java]     at org.apache.tuscany.sca.host.embedded.impl.ReallySmallRuntime.
start(ReallySmallRuntime.java:93)
     [java]     at org.apache.tuscany.sca.host.embedded.impl.DefaultSCADomain.<i
nit>(DefaultSCADomain.java:86)
     [java]     at org.apache.tuscany.sca.host.embedded.SCADomain.createNewInsta
nce(SCADomain.java:229)
     [java]     at org.apache.tuscany.sca.host.embedded.SCADomain.newInstance(SC
ADomain.java:68)
     [java]     at simple.SimpleClient.main(Unknown Source)
     [java] Java Result: 1

BUILD SUCCESSFUL
Total time: 6 seconds