[OSB] An example of how to process a zipped file in OSB

Zipで圧縮したファイルをHTTPで送信する方法について問い合わせをもらったのですが、適切な例が無かったので、作ってみました。
(注意)OSB11.1.1.5を利用しています。

このユースケースの前提は、HTTP経由でマルチパートMIMEメッセージを受信するという要件です。メッセージには、XMLドキュメントをZipで圧縮したapplication / zip形式の部分を含んでいます。このドキュメントは、Zipを展開してWSDL/SOAPサービスにルーティングする必要があります。たとえば、次のような単純な書籍カタログスキーマおよびサンプルドキュメントを作成してみました。
今回採用した方法では、2つのプロキシサービスとファイルを解凍するためのJavaクラスを使っています。残念ながら、ファイルを解凍するための機能は標準で用意していませんので、Javaコールアウトを使います。このサンプルでは、JarReaderという、簡単なクラスを作成しました。これはprocessBytesという、入力としてバイト配列を受け取り、文字列として解凍した内容を返すパブリックな静的メソッドを含んでいます。この場合のバイト配列には、圧縮されたファイルの内容を含んでいます。メソッドの実装では、圧縮されたコンテンツが文字データであり、デフォルトの文字セットでエンコードされていることを前提としています。
メインのプロキシサービス(MultipartZippedFileProxy)は、マルチパートメッセージを受信し、zipで圧縮されたXMLファイルをローカルプロキシ(ProcessZippedXMLProxy)に渡して、解凍し、XMLドキュメントをWSDL/ SOAPサービスにXMLをルーティングします。Zipを展開するためにローカルプロキシを採用したのは、正しくXMLを入力ことがより簡単だからです。

メインプロキシは次のように定義しました。
リクエストとレスポンスの種類としてテキストを持つメッセージングサービスとして、プロキシを定義しました。 OSBでマルチパートメッセージを処理する場合、メッセージ部分は、$attachments 変数経由でパイプラインにてアクセスできます。バイナリコンテンツのメッセージを処理する場合には、OSBは、内部リポジトリ内にコンテンツを配置して、バイナリコンテンツ要素を介し、パイプライン内でこのデータへのハンドルを提供します。以下はその例です。
<con:body>
    <con:binary-content ref="cid:-1d03e16:13364a4b441:-7fd6"/>
</con:body>
これは、バイナリの添付ファイルについても同様です。バイナリコンテンツでもう一つ気にかけておくべきこととして、別のサービスやJavaコールアウトにコンテンツを渡す際に、バイナリコンテンツを含む変数の要素(例えば、上記のbodyなど)ではなく、バイナリコンテンツ要素自体を渡す必要があります。OSBは、その内部ストアからバイナリコンテンツを取得し、バイト配列としてJavaコールアウトに渡します。

メインプロキシのパイプラインはパイプラインペアとルートノードで構成されています。


リクエストステージでは、"application/ zip"タイプの添付ファイルを、$attachments変数から選択して、$part変数に渡します。これを表すXPath式は以下のようになります。
$attachments/ctx:attachment[ctx:Content-Type='application/zip'][1]
(注意)ここでは、リクエストメッセージが常に一つで、application/zipタイプの部分が一つであるという前提にしています。

サービスコールアウトを使って添付のコンテンツをZip展開し、ローカルプロキシ(ProcessZippedXMLProxy)に渡します。このプロキシは別のメッセージサービスで、バイナリメッセージを入力として、書籍カタログのXMLドキュメントを返します。

先ほど述べたように、コールアウトのための入力変数を設定するために使用する式を $zippedContent とし、添付ファイルの本体からバイナリコンテンツを選択します ($part/ctx:body/ctx:binary-content)。

メインのプロキシサービスのルートノードは、マルチパートメッセージをZipから展開したXMLドキュメントで置き換え、BookCountサービスという別のプロキシサービスにルーティングします。

添付ファイルが明示的に削除されていることに気付くはずです。削除されていない場合、レスポンスメッセージ内でマルチパートメッセージが返されます。

ZIPファイルを処理するためのローカルプロキシは非常に簡単です。バイナリ入力をJavaコールアウトに渡し、コールアウトからの応答を$bodyに設定して呼出元に返します。 OSBのテストコンソールは、添付ファイル付きのテストをサポートしています。または、別の方法として、Javaアプリ内でApache CommonsのHTTPクライアントライブラリを使用してテストクライアントを作成し、メインプロキシへマルチパートメッセージを送信することができます。 ClientMultipartFormPost.javaという例を参照してください。

今回ご紹介したOSBのサンプルプロジェクトはこちらからダウンロードできます。


原文はこちら。
https://blogs.oracle.com/ateamsoab2b/entry/an_example_of_how_to

0 件のコメント:

コメントを投稿