付録A JBoss Enterprise SOA Platform に Smooks を統合する

JBoss Enterprise SOA Platform のメッセージトランスフォーメーション機能は、SmooksAction コンポーネントによって提供されます。このコンポーネントは、Smooks フレームワークをパイプラインを処理している ESB アクションへプラグできるようにする ESB アクションモジュールです。Smooks を ESB に適用するのはややこしいと感じる新規ユーザーもいるため、Smooks を公開する ESB アクションのみを設定し、設定ファイルが必要であることを念頭に置いて作業することが重要となります。

注記

JBoss Enterprise SOA Platform 製品にはトランスフォーメーションクイックスタートのサンプルが複数含まれています。特に transform_ クイックスタートに注目してください。XML2XML の例はトランスフォーメーションについて学びたいユーザーに適しています。
最も基本的な設定では、このアクションは Smooks 設定ファイルを参照する resource-config プロパティを使用します。
resource-config プロパティの値は、URIResourceLocator クラスによって定義されたように URI ベースのリソースになります。
    <action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer">
        <property name="resource-config" value="/smooks-config.xml" ></property>
    </action>

A.1. 入出力の設定

アクションは MessagePayloadProxy を使用してメッセージロードにアクセスします。デフォルトでは、Message.Body.DEFAULT_LOCATION の場所よりペイロードを取得するよう設定されています。また、処理後はこの場所に返されます。

注記

これらのデフォルト設定を上書きするには、get-payload-location および set-payload-location アクションプロパティを変更します。

A.2. Java 出力の設定

メッセージを Java オブジェクトに変換するには、有用な例を提供する Transform_XML2POJO クイックスタートを最初に確認してください。
構築された Java オブジェクトモデルをモデル駆動型トランスフォーメーションの一部として使用したり、パイプラインの SmooksAction の後に続く他の ESB アクションインスタンスによって使用可能にすることができます。
後続のパイプラインアクションインスタンスはこのような Java オブジェクトグラフを使用できます。これは、このアクションによって Java オブジェクトグラフが ESB メッセージ出力へ添付され、後続のアクションへ入力されるためです。Smooks Java Bean 設定に定義された通り、BeanId オブジェクトを直接ベースとするキー下で Message.getBody().add(...) を介して Java オブジェクトグラフは添付されます。そのため、Body.get(BeanId) 呼び出しを実行することで、ESB メッセージボディーよりオブジェクトが使用可能になります。
java-output-location プロパティを追加すると、完全な Java オブジェクトマップと出力メッセージへ添付することもできます。
    <action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer">
        <property name="resource-config" value="/smooks-config.xml" ></property>
        <property name="java-output-location" value="order-message-objects-map" ></property>
    </action>

マップを Default Message Body Location へバインドする簡単な方法は次の通りです。
    <action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer">
        <property name="resource-config" value="/smooks-config.xml" ></property>
        <property name="java-output-location" value="$default" ></property>
    </action>

A.3. プロファイルベースのトランスフォーメーション

以下の例では、3 つのソースと 1 つのターゲット宛先の間でメッセージが交換されます。
エンタープライズサービスバスは、宛先サービスへ送信する前に 3 つのソースから提供されたメッセージ (異なる形式) を Java オブジェクトに変換する必要があります。
ESB の観点では、宛先に対する単一のサービス設定が存在します。
    <service category="ServiceCat" name="TargetService" description="Target Service">
        <listeners>
            <!-- Message listners for getting the message into the action pipeline... -->
            <jms-listener name="Gateway-Listener" busidref="quickstartGwChannel" is-gateway="true"></jms-listener>
            <jms-listener name="Service-Listener" busidref="quickstartEsbChannel"></jms-listener>
        </listeners>
        <actions>

            
            <action name="transform" class="org.jboss.soa.esb.actions.converters.SmooksTransformer">
                <property name="resource-config" value="/smooks-config.xml"></property>
            </action>

            <!-- An action to process the Java Object(s) -->
            <action name="process" class="com.acme.JavaProcessor" ></action>

        </actions>
    </service>

SmooksAction の設定で分かるように、単一のトランスフォーメーション設定ファイル (smooks-config.xml) のみを定義する必要があります。次に、ソースごとに 1 つ、計 3 つの異なるトランスフォーメーションを定義する必要があります。これには、Smooks Message Profiling を使用します。
定義を 3 つの Smooks 設定ファイル (from_source1.xmlfrom_source2.xmlfrom_source3.xml) に保存します。各ファイルに設定セットの default-target-profile を指定します。
    <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd" default-target-profile="from:source1">
        <!-- Source1 to Target Java message transformation resource configurations... -->
    </smooks-resource-list>

次に、トップレベルの smooks-config.xml に追加します。
    <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd">
        <import file="classpath:/from_source1.xml" ></import>
        <import file="classpath:/from_source2.xml" ></import>
        <import file="classpath:/from_source3.xml" ></import>
    </smooks-resource-list>

これで、それぞれ一意のプロファイル名で定義された 3 つのトランスフォーメーションを持つ単一の SmooksAction インスタンスをロードするシステムが設定されました。
3 つのトランスフォーメーションのどれを指定のメッセージに適用するか SmooksAction が認識できるようにするには、メッセージが SmooksAction にフローする前にメッセージの from プロパティを設定する必要があります。これには、ソース自体または SmooksAction 以前のコンテンツベースのアクションで設定を行います (下記の transform_XML2POJO2 クイックスタートの詳細を参照してください)。

注記

JBoss Enterprise SOA Platformfrom 以外に、from-typetoto-type もサポートします。さらに複雑で交換ベースのトランスフォーメーションを実現するため、これらのプロパティを組み合わせて使用することも可能です。

A.4. Transform_XML2POJO2

上記の基本的なシナリオは、/samples/quickstarts/transform_XML2POJO2/ というクイックスタートで実装されています。このクイックスタートではメッセージソースが 2 つあります。
クイックスタートは、受信メッセージの from プロファイルを検出および設定するアクションパイプライン上で Groovy スクリプトを実行します。このプロセスで使用されるファイルは次の通りです。
  • jboss-esb.xml: JBoss ESB 設定ファイルです。
  • smooks-config.xml: トップレベルのトランスフォーメーション設定が含まれているファイルです。
  • from-dvdstore.xml: トップレベルの smooks-config.xml ファイルへインポートされる DVD Store のメッセージトランスフォーメーション設定です (プロファイル設定を確認してください) 。これは DVD Store のメッセージを Java オブジェクトに変換するための設定です。
  • from-petstore.xml: トップレベルの smooks-config.xml ファイルへインポートされる Pet Store のメッセージトランスフォーメーション設定です (プロファイル設定を確認してください) 。これは Pet Store のメッセージを Java オブジェクトに変換するための設定です。
  • check-origin.groovy: 内容を基に各メッセージのオリジンを判断する簡単な Groovy スクリプトです。