第3章 基本情報
3.1. Smooks リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks は、フラグメントベースのデータ変換および分析ツールです。これは、メッセージの断片を解釈できる汎用処理ツールです。ビジターロジックを使用してこれを実現します。XSLT または Java で変換ロジックを実装でき、メッセージセットの変換ロジックを一言管理できる管理フレームワークを提供します。
3.2. Smooks のビジターロジック リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks は ビジターロジック を使用します。ビジターは、メッセージの特定のフラグメントに対して特定のアクションを実行する Java コードです。これにより、Smooks はメッセージフラグメントに対してアクションを実行できます。
3.3. メッセージフラグメントの処理 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks は、次のタイプのメッセージフラグメント処理をサポートしています。
Templating:XSLT または FreeMarker を使用して、メッセージフラグメントを変換するJava バインド:バインドメッセージフラグメントデータを Java オブジェクトにSplitting:メッセージフラグメントを分割し、分割フラグメントを複数のトランスポートと宛先にルーティングします。エンリッチ:データベースからのデータでメッセージフラグメントをエンリッチします。Persistence:メッセージフラグメントデータをデータベースに保持します。Validation:メッセージフラグメントデータに基本的または複雑な検証を実行します。
3.4. 基本処理モデル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
以下は、Smooks で実行できるさまざまな変換のリストです。
- XML から XML
- XML to Java
- Java から XML
- Java から Java
- EDI から XML
- EDI から Java
- Java から EDI へ
- CSV から XML
3.5. サポート対象のモデル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- Simple API for XML (SAX)
- SAX イベントモデルは、XML ソースから生成できる階層 SAX イベントに基づいています。これらには、
startElementとendElementが含まれます。EDI、CSV、および Java ファイルなど、他の構造化された階層的なデータソースに適用します。 - ドキュメントオブジェクトモデル (DOM)
- このオブジェクトモデルを使用して、メッセージソースとその最終結果をマッピングします。
注記
最も重要なイベントには、タイトルに
visitBefore と visitAfter が付きます。
3.6. FreeMarker リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
FreeMarker はテンプレートエンジンです。これを使用して、
NodeModel を作成し、テンプレート操作のドメインモデルとして使用できます。Smooks は、この機能にフラグメントベースのテンプレート変換を実行する機能、およびモデルを巨大なメッセージに適用する機能を追加します。
3.7. SAX の使用例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- 実装された SAXVisitor インターフェイスが必要です。(プロセスのイベントに対応するインターフェイスを選択します。)
- この例では、
ExecutionContext名を使用しています。これは、BoundAttributeStoreクラスを拡張する パブリックインターフェイス です。
手順3.1 タスク
- 新しい Smooks 設定を作成します。これは、<xxx> 要素の
visitBeforeおよびvisitAfterイベントでビジターロジックを適用するために使用されます。 visitBeforeおよびvisitAfterイベントのロジックをイベントストリーム全体の特定の要素に適用します。ビジターロジックは、<xxx> 要素のイベントに適用されます。- FreeMarker で Smooks を使用して、巨大なメッセージに XML から XML への変換を実行します。
- 次のソース形式を挿入します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このターゲット形式を挿入します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次の Smooks 設定を使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このコードを使用して、実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - その結果、XML から XML への変換が行われます。
3.8. カートリッジ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
カートリッジ は、再利用可能な コンテンツハンドラー を含む Java アーカイブ (JAR) ファイルです。ほとんどの場合、Smooks 用の大量の Java コードを記述する必要はありません。これは、一部の機能モジュールがカートリッジとして含まれているためです。独自の新しいカートリッジを作成して、smooks-core の基本機能を拡張できます。各カートリッジは、変換プロセスまたは特定の形式の XML 分析をすぐに使用できるサポートを提供します。
3.9. 付属カートリッジ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks に付属のカートリッジは次のとおりです。
- Calc:"milyn-smooks-calc"
- CSV: "milyn-smooks-csv"
- 固定長リーダー: milyn-smooks-fixed-length
- EDI: "milyn-smooks-edi"
- Javabean: milyn-smooks-javabean
- JSON: "milyn-smooks-json"
- ルーティング: milyn-smooks-routing
- テンプレート: milyn-smooks-templating
- CSS: "milyn-smooks-css"
- サーブレット: "milyn-smooks-servlet"
- 保持: milyn-smooks-persistence
- 検証: milyn-smooks-validation
3.10. セレクター リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks リソースセレクター はビジターロジックを適用するメッセージフラグメントを Smooks に指示します。これらは、非ビジターロジックの単純なルックアップ値としても機能します。リソースがビジター実装 (<jb:bean> や <ftl:freemarker> など) の場合、Smooks はリソースセレクターを XPath セレクターとして扱います。リソースには、Java Binding Resource と FreeMarker Template Resource が含まれます。
3.11. セレクターの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
セレクターを使用する場合は、次の点が適用されます。
- 設定は、読みやすさのために、厳密に型指定されており、ドメイン固有です。
- 設定は XSD ベースです。これにより、統合開発環境 を使用する際、オートコンプリートがサポートされます。
- 特定のリソースタイプ (Java バインドの
BeanPopulatorクラスなど) に実際のハンドラーを定義する必要はありません。
3.12. namespace の宣言 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
手順3.2 タスク
- コア設定 namespace によって namespace の接頭辞から URI へのマッピングを設定し、次の XML コードを変更して、使用する namespace を含めます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.13. フィルタリングプロセスの選択 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
これは、Smooks が フィルタリングプロセス を選択する方法です。
- DOM ビジターインターフェイス (
DOMElementVisitorおよびSerializationUnit) のみが適用されている場合、DOM 処理モデルは自動的に選択されます。 - すべてのビジターリソースが SAX ビジターインターフェイス (
SAXElementVisitor) のみを使用する場合は、SAX 処理モデルが自動的に選択されます。 - ビジターリソースが DOM と SAX の両方のインターフェイスを使用する場合は、Smooks リソース設定ファイルで SAX を指定しないかぎり、デフォルトでは、DOM 処理モデルが選択されます。(これは、
<core:filterSettings type="SAX" />を使用すると、実行されます。)
ビジターリソースには、
リーダー などの 非要素のビジターリソースは 含まれません。
3.14. Smooks 1.3 でフィルタータイプを SAX に設定する例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
3.15. DomModelCreator リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
DomModelCreator は、メッセージフラグメントのモデルを作成するために Smooks で使用できるクラスです。
3.16. DOM モデルと SAX モデルの混合 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- ノードトラバーサル (つまり、ノード間の情報の送信) と既存のスクリプト/テンプレートエンジンに DOM (ドキュメントオブジェクトモデル) を使用します。
DomModelCreatorビジタークラスを使用して、SAX モデルと DOM モデルを混在させます。このビジターは、SAX フィルタリングで使用すると、ビジットされた要素から DOM フラグメントを構成します。これにより、ストリーミング環境内で DOM ユーティリティーを使用できます。- 複数のモデルがネストされている場合、外側のモデルに内側のモデルのデータが含まれることはありません (つまり、同じフラグメントが 2 つのモデル内に共存することはありません)。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.17. DomModelCreator の設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- Smooks 内から DomModelCreator を設定して、order および注文品目メッセージフラグメントのモデルを作成します。以下の例を参照してください。
<resource-config selector="order,order-item"> <resource>org.milyn.delivery.DomModelCreator</resource> </resource-config><resource-config selector="order,order-item"> <resource>org.milyn.delivery.DomModelCreator</resource> </resource-config>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のように、
orderのメモリー内モデルを設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記新しいモデルごとに前のモデルが上書きされるため、一度に複数の注文品目モデルがメモリーに存在することはありません。
3.18. DomModelCreator に関する詳細情報 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- FreeMarker テンプレート: http://www.smooks.org/mediawiki/index.php?title=V1.3:xml-to-xml
3.19. Bean コンテキスト リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Bean コンテキスト には、フィルタリングが発生した際、Smooks がアクセスするオブジェクトが含まれています。実行コンテキストごとに 1 つの Bean コンテキストが作成されます (
Smooks.filterSource 操作を使用)。カートリッジが作成するすべての Bean は、その beanId に従って、ファイルされます。
3.20. Bean コンテキストの設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks.filterSourceプロセスの最後に Bean コンテキストのコンテンツを返すには、Smooks.filterSourceメソッドの呼び出しでorg.milyn.delivery.java.JavaResultオブジェクトを指定します。この例は、次の方法を示しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 起動時に Bean コンテキストにアクセスするには、これを
BeanContextオブジェクトで指定します。getBeanContext()メソッドでExecutionContextから取得できます。 BeanContextからオブジェクトを追加または取得する場合は、まず、beanIdStoreからbeanIdオブジェクトを取得してください。(beanIdオブジェクトは、文字列キーもサポートされていますが、文字列キーよりも高いパフォーマンスを保証する特殊なキーです。)getbeanIdStore()メソッドを使用して、ApplicationContextからbeanIdStoreを取得する必要があります。beanIdオブジェクトを作成するには、register("beanId name")メソッドを呼び出します。(beanId がすでに登録されていることがわかっている場合は、getbeanId("beanId name")メソッドを呼び出すと、取得できます)。beanIdオブジェクトはApplicationContextスコープのオブジェクトです。それらをカスタムビジター実装の初期化メソッドに登録してから、ビジターオブジェクトにプロパティーとして配置します。その後、それらをvisitBeforeおよびvisitAfterメソッドで使用できます。(beanIdオブジェクトとbeanIdStoreはスレッドセーフです。)
3.21. プリインストールされた Bean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
次の Bean がプリインストールされています。
PUUID: UniqueId Bean。この Bean は、フィルタリングExecutionContextに一意の識別子を提供します。PTIME: 時間 Bean。この Bean は、フィルタリングExecutionContextに時間ベースのデータを提供します。
これらの例は、FreeMarker テンプレートでこれらの Bean を使用する方法を示しています。
- ExecutionContext の一意の ID (フィルタリングされるメッセージ):
$PUUID.execContext - ランダムな一意の ID:
$PUUID.random - メッセージフィルタリングの開始時間 (ミリ秒単位):
$PTIME.startMillis - メッセージフィルタリングの開始時間 (ナノ秒単位):
$PTIME.startNanos - メッセージフィルタリングの開始時間 (日付):
$PTIME.startDate - 現在時間 (ミリ秒単位):
$PTIME.nowMillis - 現在時間 (ナノ秒単位):
$PTIME.nowNanos - 現在時間 (日付):
$PTIME.nowDate
3.22. 複数の出力/結果 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks は次の方法で出力を生成します。
- 結果内インスタンスで。これらは、
Smooks.filterSourceメソッドに渡された結果インスタンスで返されます。 - フィルタリングプロセス中。これは、フィルタリングプロセス中に生成され、外部エンドポイント (ESB サービス、ファイル、JMS 宛先、データベースなど) に送信される出力によって実現されます。メッセージフラグメントイベントは、外部エンドポイントへの自動ルーティングをトリガーします。
重要
Smooks は、メッセージストリームの 1 つのフィルタリングパスで上記の方法で出力を生成できます。複数の出力を生成するために、メッセージストリームを複数回フィルタリングする必要はありません。
3.23. 結果内インスタンスの作成 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- API に見られるように、複数の結果インスタンスを Smooks に提供します。
public void filterSource(Source source, Result... results) throws SmooksException
public void filterSource(Source source, Result... results) throws SmooksExceptionCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Smooks は、同じタイプの複数の結果インスタンスからの結果データの取得をサポートしていません。たとえば、Smooks.filterSourceメソッド呼び出しで複数の StreamResult インスタンスを指定できますが、Smooks は、これらの StreamResult インスタンスのうち 1 つ (最初の 1 つ) のみに出力します。
3.24. サポート対象の結果タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks は、標準の
JDK StreamResult および DOMResult の結果タイプだけでなく、次の特殊なタイプでも動作します。
JavaResult: この結果タイプを使用して、Smooks Java Bean コンテキストの内容を取得します。ValidationResult: この結果タイプを使用して、出力を取得します。- シンプルな結果タイプ: テストを書く際、これを使用します。これは、
StringWriterをラップするStreamResult拡張です。
3.25. イベントストリームの結果 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks がメッセージを処理すると、イベントのストリームが生成されます。
StreamResult または DOMResult が Smooks.filterSource 呼び出しで提供される場合、デフォルトでは、Smooks はイベントストリーム (ソースによって生成される) を提供された結果に XML としてシリアル化します。(シリアル化の前に、ビジターロジックをイベントストリームに適用できます。)
注記
これは、標準の 1 入力/1 XML 出力の文字ベースの変換を実行するために使用される機能です。
3.26. フィルタリングプロセス中 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Smooks は、
Smooks.filterSource プロセス中に、さまざまな出力を生成します。(これは、メッセージの最後に到達する前に、メッセージイベントストリーム中に、発生します。) この例は、他のプロセスによる実行のために、メッセージフラグメントを分割して、さまざまなエンドポイントにルーティングするために使用される場合です。
Smooks は、メッセージデータをバッチ処理して、完全なメッセージをフィルタリングした後、すべての出力を生成することはありません。これは、パフォーマンスが影響を受けるためであり、メッセージイベントストリームを利用して、フラグメント変換およびルーティング操作をトリガーできるためです。大きなメッセージは、プロセスをストリーミングすることによって、送信されます。
3.27. Smooks 実行プロセスの確認 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- Smooks から実行レポートを取得するには、レポートを生成するように、
ExecutionContextクラスを設定する必要があります。(Smooks は、メッセージを処理する際、イベントを発行します。) 次のサンプルコードは、HTML レポートを生成するように、Smooks を設定する方法を示しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow HtmlReportGenerator機能を使用すると、デバッグ時に役立ちます。注記Web ページ http://www.milyn.org/docs/smooks-report/report.html でサンプルレポートを確認できます。注記また、カスタムのExecutionEventListener実装を作成できます。
3.28. フィルタリングプロセスの終了 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- メッセージの最後に到達する前に、Smooks フィルタリングプロセスを終了するには、<
core:terminate> 設定を Smooks 設定に追加します。(これは SAX で機能し、DOM では必要ありません。)メッセージの顧客フラグメントの最後でフィルタリングを終了する設定例は次のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - メッセージの先頭で終了するには (
visitBeforeイベント)、次のコードを使用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.29. グローバル設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- デフォルトプロパティー
- デフォルトプロパティーは、
<resource-config>属性のデフォルト値を指定します。これらのプロパティーは、対応する<resource-config>が属性の値を指定しない場合、SmooksResourceConfigurationクラスに自動的に適用されます。 - グローバルパラメーター
- すべての
<resource-config>の<param>要素を指定できます。これらのパラメーター値は、SmooksResourceConfigurationによって実行時に利用できるか、そうでない場合は、@ConfigParamアノテーションによって注入されます。グローバル設定パラメーターは 1 か所に定義されます。すべてのランタイムコンポーネントは、ExecutionContextを使用して、それらにアクセスできます。
3.30. グローバル設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- 次のように、グローバルパラメーターは、
<params>要素で指定されます。<params> <param name="xyz.param1">param1-val</param> </params><params> <param name="xyz.param1">param1-val</param> </params>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ExecutionContextでグローバルパラメーターにアクセスします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.31. デフォルトプロパティー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
デフォルトプロパティーは、Smooks 設定のルート要素に設定でき、
smooks-conf.xml ファイルのリソース設定に適用されます。すべてのリソース設定のセレクター値が同じである場合は、default-selector=order を指定できます。つまり、すべてのリソース設定でセレクターを指定する必要はありません。
3.32. デフォルトプロパティーの設定例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
3.33. デフォルトプロパティーのオプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- default-selector
- 他のセレクターが定義されていない場合、これは、Smooks 設定ファイル内のすべての resource-config 要素に適用されます。
- default-selector-namespace
- これはデフォルトのセレクター namespace です。他の namespace が定義されていない場合に使用されます。
- default-target-profile
- これはデフォルトのターゲットプロファイルです。他のターゲットプロファイルが定義されていない場合、Smooks 設定ファイル内のすべてのリソースに適用されます。
- default-condition-ref
- これは、条件識別子によってグローバル条件を参照します。この条件は、グローバルに定義された条件を参照しない空の条件要素 (つまり、<condition/>) を定義するリソースに適用されます。
3.34. フィルター設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- フィルタリングオプションを設定するには、smooks-core 設定 namespace を使用します。以下の例を参照してください。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.35. フィルターオプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- type
- これにより、SAX または DOM のいずれかから使用される処理モデルのタイプが決まります。(デフォルトは DOM です。)
- defaultSerialization
- これは、デフォルトのシリアル化をオンにするかどうかを決定します。デフォルト値は
trueです。これをオンにすると、Smooks.filterSourceメソッドに提供された結果オブジェクトのStreamResult(またはDOMResult) を探し、デフォルトでは、その結果に対するすべてのイベントをシリアル化するように、Smooks に指示します。グローバル設定パラメーターを使用して、この動作をオフにするか、結果ライターの所有権を取得する (SAX フィルタリングを使用する場合) か、DOM を変更する (DOM フィルタリングを使用する場合) フラグメントのビジター実装をターゲットにして、フラグメント単位でこの動作をオーバーライドできます。 - terminateOnException
- これを使用して、例外によって処理を終了する必要があるかどうかを判断します。デフォルト設定は
trueです。 - closeSource
- これにより、
Smooks.filterSourceメソッドに渡されたソースインスタンスストリームが閉じます (デフォルトはtrue)。ここでの例外は、まったく閉じられないSystem.inです。 - closeResult
- これにより、
Smooks.filterSourceメソッドに渡された結果ストリームが閉じます (デフォルトはtrue)。ここでの例外は、まったく閉じないSystem.outとSystem.errです。 - rewriteEntities
- これを使用して、XML の読み取りおよび書き込み (デフォルトのシリアル化) 時に XML エンティティーを書き換えます。
- readerPoolSize
- これにより、リーダープールのサイズが設定されます。一部のリーダーの実装は、作成に非常にコストがかかります。リーダーインスタンスをプールする (つまり、それらを再利用する) と、特に多くの小さなメッセージを処理する場合は、パフォーマンスが大幅に向上する可能性があります。この設定のデフォルト値は
0です (つまり、プールされません。メッセージごとに新しいリーダーインスタンスが作成されます)。アプリケーションのスレッドモデルに合わせて、これを設定します。