第9章 ルーティング出力データ

Smooks は、メッセージ断片の分割とルーティングに対して複数のオプションをサポートしています。メッセージを断片に分割し、これらの断片を異なる種類のエンドポイント (ファイル、JMS など) へルーティングする機能は大変重要な機能です。Smooks はこの機能を大変興味深い「ひねり」を加えて提供します。
  • 基本の断片分割: メッセージにあるすべての注文商品断片を分割してファイルにルーティングするなど、メッセージ上で単にダム分割(dumb split) を実行する必要がある場合が多くあります。「ダム分割」とは、ルーティングを行う前にメッセージ階層の他の部分からデータをマージするなど、分割メッセージの断片でトランスフォーメーションを実行する必要がないことを意味します (ルーティングを行う前に顧客詳細情報を注文商品断片に追加する場合など)。基本的な分割やルーティングには、分割するメッセージ断片の XPath の定義や、未変更の分割メッセージ断片をルーティングするためのルーティングコンポーネント (JBoss ESB や Camel など) の定義が関係します。「基本の分割とルーティング」を参照してください。
  • 複雑な断片分割: 基本の断片分割は多くのユースケースに使用でき、ほとんどの分割とルーティングのソリューションで提供されます。Smooks では、ルーティングが適用される前に分割断片データ上でトランスフォーメーションの実行を可能にすることで、基本の分割機能を拡張します。注文商品の分割断片をルーティングする前に顧客詳細の注文情報を各注文商品情報とマージすることがこの例になります。
  • インストリーム分割とルーティング (大型メッセージのサポート): Smooks はルーティングを「インストリーム」(メッセージ全体を処理した後、ルーティング向けに一括処理されない) で実行できるため、巨大なメッセージのストリーム (>> GB) の処理に対応できます。
  • 複数の分割とルーティング: 入力メッセージストリームの単一のフィルタリングパスにある異なるエンドポイントへ複数のメッセージ断片 (XML、EDI、Java などの異なる形式) を条件付きで分割およびルーティングします。$1,000 を越える注文商品に対しては HighValueOrdersValidation JMS キューへ OrderItem Java オブジェクトインスタンスをルーティングし、ログに記録するためすべての注文商品 (無条件) を XML/JSON として HTTP エンドポイントへルティングすることがこの例の 1 つとなります。
http://www.milyn.org/xsd/smooks/camel-1.4.xsd の設定名前空間より設定をルーティングすると、camel を使用して断片を Apache Camel へルーティングすることが可能です。
例えば、以下を Smooks の設定に指定すると、Camel エンドポイントへのルーティングが可能になります。
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
         xmlns:camel="http://www.milyn.org/xsd/smooks/camel-1.4.xsd">
 
  <!-- Create some bean instances from the input source... -->
  <jb:bean BeanId="orderItem"  ... ">
    <!-- etc... See Smooks Java Binding docs -->
  </jb:bean>
 
  <!-- Route bean to camel endpoints... -->
  <camel:route BeanId="orderItem">
    <camel:to endpoint="direct:slow" if="orderItem.priority == 'Normal'" />
    <camel:to endpoint="direct:express" if="orderItem.priority == 'High'" />
  </camel:route>
 
</smooks-resource-list>
上記の例では、Smooks BeanContext からの Java Bean を Camel エンドポイントへルーティングします。テンプレートを (FreeMarker など) を同じ Bean に適用して、Bean の代わりにテンプレートの結果をルーティングすることも可能です (XML や CSV などとして)。
上記の設定は、BeanId 属性を使用したルーティングを表しています。routeOnElement という属性を使用してルーティングすることも可能です。