転送 SDK
ユーザーズ ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容

設計上の考慮事項

開発作業を綿密に計画すると、カスタム転送プロバイダの開発に要する時間と労力を大幅に削減できます。以下の節では、最初に知っておくと役立つ、転送プロバイダの概念と機能について詳しく説明します。

 


転送プロバイダとは

転送プロバイダは、転送 SDK のインタフェースを実装し、AquaLogic Service Bus とメッセージを送受信するメカニズムとの橋渡しをします。このようなメカニズムには、HTTP などの特定の転送プロトコルだけでなく、ファイルや電子メール メッセージなど、他のエンティティが含まれる場合もあります。転送プロバイダは、転送エンドポイントのライフ サイクルおよび実行時の動作を管理します。エンドポイントは、メッセージの送信元または送信先となるリソースです。

図 2-1 は、AquaLogic Service Bus を介した基本的なメッセージの流れを示したものです。クライアントは、特定の転送プロトコルを使用して AquaLogic Service Bus にメッセージを送信します。転送プロバイダは、着信メッセージを処理します。サービス クライアント エンドポイントとの通信を処理し、AquaLogic Service Bus へのメッセージのエントリ ポイントとして機能します。

図 2-1 AquaLogic Service Bus を介したメッセージ フロー

AquaLogic Service Bus を介したメッセージ フロー

図 2-1 にはバインディング レイヤも示されています。これは、メッセージのパックおよびアンパック、メッセージのセキュリティ処理を行い、AquaLogic Service Bus パイプラインにメッセージを渡します。

ヒント : AquaLogic Service Bus のメッセージ ブローカリングおよび転送レイヤの役割の詳細については、AquaLogic Service Bus の概念とアーキテクチャを参照してください。AquaLogic Service Bus を介したメッセージ フローについてのより詳細なシーケンス ダイアグラムについては、「UML シーケンス ダイアグラム」を参照してください。

デフォルトでは、AquaLogic Service Bus には、HTTP、JMS、ファイル、FTP など、一般的に使用されている複数の転送プロトコルをサポートする転送プロバイダが用意されています。これらのネイティブなプロバイダを使用して、前述の一般的な転送プロトコルを必要とするプロキシ サービスおよびビジネス サービスをコンフィグレーションできます。表 2-1 に、これらの組み込みプロバイダを示します。

表 2-1 AquaLogic Service Bus と共にインストールされる転送プロバイダ
転送プロバイダ
説明
電子メール
電子メール転送を使用して電子メール メッセージの送受信を行う。着信メッセージは IMAP または POP3 を介して受信され、送信メッセージは SMTP を介して送信される。
EJB
ビジネス サービスで EJB 転送プロバイダを使用し、AquaLogic Service Bus から他のドメインにあることが考えられる EJB にアクセスする。
EJB 転送プロバイダは、転送 SDK によって定義される自己記述転送で、WSDL を生成してサービス インタフェースを記述する。この転送プロバイダをプロキシで使用して、AquaLogic Service Bus を EJB としてエクスポーズすることはできない。
ファイル
ファイル転送を使用して、ファイル ベースのメッセージを受信したり、または、ローカル ファイル システムからファイルを記述したりする。
FTP
FTP 転送プロバイダを使用して FTP サーバと通信し、FTP ファイルを取得したり、置いたりする。
HTTP/HTTPS
HTTP または HTTPS 転送プロバイダを使用して、HTTP/S メッセージを送受信する。
JMS
JMS 転送プロバイダを使用して、JMS メッセージを送受信する。
ローカル
メッセージ フローのその他のプロキシ サービスによって呼び出されたプロキシ サービスでローカル転送プロバイダを使用する。
AquaLogic Service Bus には、2 つのカテゴリのプロキシ サービスがある。1 番目のカテゴリのプロキシ サービスはクライアントによって直接呼び出され、2 番目のカテゴリのプロキシサービスはメッセージ フローのその他のプロキシ サービスによって呼び出される。2 番目のカテゴリのプロキシ サービスでは、ローカル転送と呼ばれる新しい転送方式を使用する。
Tuxedo
Tuxedo 転送プロバイダを使用すると、Tuxedo ドメインと AquaLogic Service Bus の間で、安全かつ信頼性の高い、高パフォーマンスの双方向アクセスが保証される。この転送プロバイダを使用することで、BEA AquaLogic Service Bus と BEA Tuxedo を相互運用して、各製品に用意されているサービスを使用できる。

ヒント : これらのネイティブな転送プロバイダの使用およびコンフィグレーションの詳細については、AquaLogic Service Bus ユーザーズ ガイドを参照してください

 


転送 SDK とは

この節では、転送 SDK の用途および機能について簡単に説明します。この節の内容は以下のとおりです。

SDK の用途

AquaLogic Service Bus では、メッセージがシステムに出入りする方法とは無関係にメッセージを処理します。転送 SDK は、AquaLogic Service Bus と、AquaLogic Service Bus に出入りするデータのフローを処理するコンポーネントとの間の抽象レイヤを提供します。この抽象レイヤにより、独自の転送プロトコルを処理するための新しい転送プロバイダを開発できます。AquaLogic Service Bus と共にインストールされる転送プロバイダのリストについては、「表 2-1 AquaLogic Service Bus と共にインストールされる転送プロバイダ」を参照してください。

SDK は、AquaLogic Service Bus の他の部分から以下を抽象化します。

転送 SDK の機能

この節では、転送 SDK の主要な機能について説明します。

着信メッセージおよび発信メッセージの処理

転送 SDK を使用して開発された転送プロバイダは、以下のように着信メッセージおよび発信メッセージを処理します。

転送 SDK は、発信メッセージおよび着信メッセージを個別に処理します。着信メッセージを 1 つの転送プロトコルにバインドし、発信エンドポイントで異なる転送プロトコルにバインドすることもできます。

AquaLogic Service Bus のメッセージ フローの詳細については、AquaLogic Service Bus ユーザーズ ガイドを参照してください

転送関連のアーティファクトのデプロイ

一部の転送では、アーティファクトを WLS サーバにデプロイする必要があります。たとえば、JMS プロキシは、メッセージ駆動型 Bean として実装されます。このアーティファクト、EAR ファイルは、新しい JMS プロキシを登録する際にデプロイする必要があります。同様に、EJB 転送プロバイダでは EAR ファイルを使用しますが、これは新しい EJB ビジネス サービスを登録する際にデプロイする必要があります。サービス登録の一環としてキューおよびトピックを作成することがある JMS 転送などのように、その他のタイプのアーティファクトのデプロイが必要になる場合があります。SDK により、これらのアーティファクトをサポートし、WLS のデプロイメント サイクルに参加できます。これらのアーティファクト ファイルのいずれかのデプロイメントが失敗した場合、AquaLogic Service Bus のセッションに通知され、デプロイメントはキャンセルされます。SDK のこの機能により、サービスを最小単位で作成できます。失敗が発生した場合、セッションは以前の状態に戻ります。

注意 : WLS のデプロイメント サイクルに参加するには、転送プロバイダが TransportWLSArtifactDeployer インタフェースを実装している必要があります。この方法の第一の利点は、最小単位で WebLogic Server をデプロイできる点であり、必要に応じてロールバックすることもできます。このインタフェースの詳細については、「汎用インタフェースの概要」および「TransportWLSArtifactDeployer の実装が適している場合」を参照してください。

メッセージの非同期的な処理

メッセージを処理する際、サーバで動作するスレッド数には限りがあるため、非同期的に行うことが重要です。この機能により、多数のメッセージを処理できるように AquaLogic Service Bus を拡張できます。要求が処理されると、スレッドは解放されます。ビジネス サービスが応答を受信すると (または、一方向の場合は要求を処理し終えると)、コールバックによって AquaLogic Service Bus に非同期的に通知します。

同期トランザクションのサポート」および「スレッディング モデル」も参照してください。

転送プロバイダのモード

転送 SDK を使用して、着信プロパティのモードおよび発信プロパティのモードを実装できます。これらの接続モードおよびエンドポイント モードは、転送プロバイダの XML スキーマ定義ファイルで指定します。このファイルの詳細については、「3. 転送固有のアーティファクトの XML スキーマ ファイルの作成」を参照してください。このスキーマは、AquaLogic Service Bus パイプラインでフィルタ処理およびルーティングを行う際に使用できます。

関連機能

この節では、転送マネージャによって提供される関連機能について示します。転送マネージャは、さまざまな転送プロバイダの管理、エンドポイントの登録、制御、着信メッセージと発信メッセージの処理、およびその他の機能を一元化するための主要ポイントとなります。これらの機能は、転送プロバイダによる特定のサポートを必要としません。

ロード バランシング

転送 SDK は、発信メッセージのロード バランシングおよびフェイルオーバをサポートします。サポートされているロード バランシングのオプションは以下のとおりです。

モニタおよびメトリック

転送マネージャは以下のモニタ用メトリックを処理します。

 


カスタム転送プロバイダの開発の必要性

この節では、カスタム転送プロバイダの記述が必要となる基本的な使用例について説明します。別の方法を選択した方が適切な場合もあります。この節の内容は以下のとおりです。

転送 SDK の使用が適している場合

転送 SDK の主要な使用例の 1 つは、既に内部アプリケーション間の通信に使用している特別な転送をサポートすることです。このような転送では、セットアップされたハンドシェーク、ヘッダ フィールド、メタデータ、または転送レベルのセキュリティに独自の概念が用いられている場合があります。転送 SDK を使用して、個々のエンドポイントや、着信および発信のいずれか、または両方のコンフィグレーションを可能にする、AquaLogic Service Bus の転送の実装を作成できます。カスタム転送を実装することで、特別な転送のメタデータおよびヘッダ フィールドをプロキシ サービス パイプラインで使用できるコンテキスト変数にマッピングできます。

信頼性、セキュリティ、パフォーマンス、管理、ユーザ インタフェースおよび UDDI レジストリの使用のために、転送プロバイダを AquaLogic Service Bus のあらゆる側面にシームレスに統合する必要がある場合は、転送 SDK を使用してください。

転送 SDK を使用してカスタム転送を開発した方が良い場合の例を以下に示します。

また、転送 SDK を使用して、AquaLogic Service Bus で提供される既存の転送の 1 つで特別なプロトコルをサポートできます。この例には、以下のサポートが含まれます。

別の方法を選択した方が良い場合

転送 SDK を使用して新しい AquaLogic Service Bus 転送プロバイダを作成する場合、多大な労力が必要となることがあります。転送 SDK は、カスタム転送が、AquaLogic Service Bus にネイティブに付属する転送の利便性と機能をすべて活用できるようにするために、多彩な機能をすべて備えた環境を提供します。ただし、このような多彩な機能を持ったカスタム転送は複雑になります。場合によっては、より簡単な別の方法を検討することをお勧めします。

既存のプロトコルを介して送受信される、異なるフォーマットのメッセージをサポートするためだけに拡張機能が必要な場合は、既存の転送および Java コールアウトを使用してメッセージを変換できる場合があります。たとえば、標準の JMS プロトコルを介して送信される (ASN.1 またはシリアライズされた Java オブジェクトなどの) 特別なバイナリ フォーマットを使用しているとします。この場合、サービスのタイプがバイナリの入出力メッセージを使用するメッセージング サービスである、標準の JMS 転送を使用したサービスを定義することも検討できます。次に、パイプラインでメッセージ コンテンツが必要な場合は、Java コールアウト アクションを使用してメッセージを XML に変換したり XML から変換したりできます。Java コールアウトの使用については、AquaLogic Service Bus ユーザーズ ガイドの「Java コールアウトおよび POJO を使用した拡張性」を参照してください

転送 SDK を使用してカスタム転送を開発することが最適とは言えないその他の例を以下に示します。

 


転送プロバイダのコンポーネント

この節では、転送プロバイダの実行時および設計時のコンポーネントについて説明した UML ダイアグラムを示します。この節の内容は以下のとおりです。

概要

通常、カスタム転送プロバイダは設計時部分と実行時部分から構成されています。設計時部分では、転送プロバイダへのエンドポイントの登録を行います。このコンフィグレーション動作は、UI インタフェースの実装によって実行されます。実行時部分では、メッセージの送受信のメカニズムを実装します。

新しいカスタム転送プロバイダを開発する場合は、SDK によって提供される多数のインタフェースを実装する必要があります。この節では、SDK の設計時部分および実行時部分の構成をモデル化した UML ダイアグラムを示します。

ヒント : AquaLogic Service Bus では、TransportProvider インタフェースの実装は、転送プロトコル固有のコンフィグレーション プロパティおよび実行時プロパティの集中的な管理ポイントとなります。サポートされているプロトコルごとに、TransportProvider オブジェクトの単一のインスタンスが存在します。たとえば、HTTP 転送プロバイダ、JMS 転送プロバイダ、およびその他の転送プロバイダに、それぞれ単一のインスタンスが存在します。

詳細については、「転送プロバイダの開発」で、必要なインタフェースのリストを参照してください。転送 SDK によって提供されるインタフェースおよびクラスの概要については、「転送 SDK のインタフェースおよびクラス」を参照してください。詳細な説明については、AquaLogic Service Bus クラスの Javadoc を参照してください。

設計時のコンポーネント

カスタム転送プロバイダの設計時部分はユーザ インタフェースのコンフィグレーションから構成されています。このコンフィグレーションは、新しいビジネス サービスまたはプロキシ サービスが登録される際に、AquaLogic Service Bus Console によって呼び出されます。図 2-2 に、転送プロバイダの設計時部分の構造を説明した UML ダイアグラムを示します。ダイアグラムでは以下のインタフェースについて説明しています。

注意 : 各転送エンドポイントのコンフィグレーションは、任意の転送プロバイダのすべてのエンドポイントに対して汎用なプロパティ (URI など) と、そのプロバイダのエンドポイントだけに固有のプロパティとで構成されます。図 2-3 は、共有のエンドポイント コンフィグレーション プロパティと転送プロバイダ固有のコンフィグレーション プロパティの関係を示しています。詳細については「転送エンドポイントのプロパティの概要」を参照してください。
図 2-3 EndPointConfiguration のプロパティ

EndPointConfiguration のプロパティ

実行時のコンポーネント

カスタム転送プロバイダの実行時部分では、以下を行います。

実行時フレームワークでは、転送プロバイダは、転送マネージャを呼び出して着信メッセージを受信したことを認識します。転送メッセージ コンテキストには着信メッセージのヘッダおよび本文が含まれています。発信メッセージの場合、TransportSendListener および TransportSender があります。転送プロバイダは、メッセージからヘッダおよび本文を取得します。

図 2-4 に、転送プロバイダの実行時部分の構造を説明した UML ダイアグラムを示します。

図 2-4 実行時の UML ダイアグラム

実行時の UML ダイアグラム

 


トランザクション モデル

転送 SDK を使用して新しい転送プロバイダを開発する前に、メッセージ エンドポイントのトランザクション モデルを検討することが重要です。この節では、AquaLogic Service Bus で使用されるトランザクション モデル、およびそのモデルが転送 SDK にどのように関係するかを説明します。

この節の内容は以下のとおりです。

転送エンドポイントのプロパティの概要

転送エンドポイントは、JMS プロキシ サービスなどの AquaLogic Service Bus リソースであり、メッセージの送信元または送信先となります。AquaLogic Service Bus では、転送エンドポイントはプロトコル固有の転送プロバイダによって管理されます。転送プロバイダは、転送エンドポイントのライフ サイクルおよび実行時動作を管理するプラグイン オブジェクトです。

AquaLogic Service Bus のトランザクション モデルを理解するには、サービス転送エンドポイントのプロパティを確認しておくと役に立ちます。

トランザクション対応のエンドポイントとトランザクション非対応のエンドポイント

エンドポイントはトランザクション対応の場合と非対応の場合があります。トランザクション対応のエンドポイントは、メッセージを処理する際に、グローバル トランザクションのコンテキスト内で開始または追加できます。以下の例では、トランザクションのプロパティがエンドポイントによってどのように異なるかを示します。

特定のプロキシ サービスの詳細については、AquaLogic Service Bus ユーザーズ ガイドを参照してください。

サポートされているメッセージ パターン

任意のエンドポイントで、以下のメッセージ パターンのいずれかを使用できます。

同期トランザクションのサポート

EJB 転送および Tuxedo 転送は、同期トランザクションをサポートします。以前は、AquaLogic Service Bus では、JMS 転送のみがトランザクションをサポートしており、トランザクションは、AquaLogic Service Bus ドメインから開始され、AquaLogic Service Bus ドメインによってバインドされていました。EJB 転送および Tuxedo 転送を使用することで、トランザクションを AquaLogic Service Bus の外部から開始したり、外部ドメインにパス スルーしたりすることができます。同期トランザクション対応の転送がサポートする使用例は以下のとおりです。

使用例 1 (応答パイプラインの処理)

応答パイプラインの処理は、着信転送が同期トランザクションをサポートする場合に、受信トランザクションに含まれます。この例は、着信転送が他の発信転送とペアである場合にサポートされます。例外については、以下の注意を参照してください。

注意 : 着信転送が同期トランザクションで発信転送が非同期トランザクションの場合、デッドロック状況が発生します。デッドロックが発生する原因は、トランザクションがコミットされるまで発信要求が使用できないにもかかわらず、トランザクションが外部で開始され、AquaLogic Service Bus が応答を受け取り制御が戻るまでコミットされないためです。転送マネージャはこの状況を認識し、実行時エラーを送出してデッドロックを回避します。
注意 : たとえば、Tuxedo プロキシ サービスなどの同期トランザクションの着信エンドポイントを使用していて、JMS プロキシ サービスなどのように発信エンドポイントが非同期トランザクションである場合、応答を受信するまで発信要求はトランザクションをコミットしません。応答は、外部エンティティが要求を受け取り、処理するまで受信できません。

また、この場合、応答パイプラインで実行される AquaLogic Service Bus パブリッシュ アクションは、トランザクションの一部として行われます。これは要求パイプラインで実行されるパブリッシュ アクションがトランザクションの一部として行われるのと同様です。

注意 : 複数のアクションが (要求パイプラインまたは応答パイプラインの) トランザクションに参加できます。これには、パブリッシュ アクション、サービス コールアウト アクション、およびレポート アクションが含まれます。

たとえば、着信 Tuxedo 転送が同期トランザクションの場合、要求パイプラインおよび応答パイプラインが完了した場合のみコミットできます。この場合、転送マネージャは、トランザクション コンテキストを着信スレッドから発信スレッドに転送します。応答スレッドが終了すると、トランザクション コントロールおよび結果が呼び出しクライアントに返されます。

使用例 2 (サービス コールアウトの処理)

AquaLogic Service Bus サービス コールアウトを使用すると、あるプロキシ サービスから別のサービスへのコールアウトを行うことができます。同期トランザクション対応の転送に対しサービス コールアウト アクションが実行された場合、「ベスト エフォート」のサービス品質に加えて、「必ず 1 回」のサービス品質がサポートされます。「必ず 1 回」では、発信メッセージの送信が開始されるまでは終了エラーが発生しないことを前提として、メッセージが着信から発信に 1 回だけ配信されます。「ベスト エフォート」では、それぞれの送信で独自のトランザクション コンテキストが定義されます (トランザクション対応の転送方式の場合)。「ベスト エフォート」が指定されている場合、メッセージングの機能に信頼性はなく、重複するメッセージは除去されませんが、パフォーマンスが最適化されます。「TransportOptions の操作」も参照してください。

同期トランザクション対応の転送へのコールアウトは必要に応じて既存のトランザクションの一部になります。たとえば、グローバル トランザクション中に要求パイプラインを実行しいても、サービス コールアウトはトランザクションへの参加を許可されます。たとえば、EJB サービスへのコールアウトがある場合、サービスは、必要に応じてそのトランザクションに参加できます。

サービス コールアウトの詳細については、『AquaLogic Service Bus Console の使い方』の「サービス コールアウト」を参照してください。メッセージの信頼性の詳細については、AquaLogic Service Bus ユーザーズ ガイドを参照してください。

使用例 3 (トランザクションの中断)

以下の条件に当てはまる場合、転送プロバイダを呼び出して発信要求を送信する前に、転送フレームワークがトランザクションを中断します。

「送信」操作が完了すると、中断されていたトランザクションが再開されます。

使用例 4 (複数の URI)

任意の発信サービス エンドポイントに、関連付けられている URI が複数あり、トランザクション対応である場合、フェイルオーバが発生する場合は、トランザクションの間にのみ発生し、ロールバックのマークは付けられていません。たとえば、URI が呼び出され、サービスがエラーを返した場合、フェイルオーバは正常にトリガされます。この場合、転送フレームワークが、トランザクションにロールバックのマークが付けられていることを検出するため、フレームワークは、別の URI に対しフェイルオーバを実行しません。

 


セキュリティ モデル

転送 SDK により、ユーザおよびサードパーティは、AquaLogic Service Bus に新しい転送をプラグインできます。AquaLogic Service Bus のセキュリティ モデル内では、転送プロバイダは信頼できるコードと見なされます。セキュリティ ホールによる潜在的なセキュリティ上の脅威を避けるため、転送プロバイダの実装は慎重に設計することが重要です。このドキュメントには、安全な転送プロバイダを開発する方法についての具体的なガイドラインは含まれていませんが、この節では、以下の転送 SDK のセキュリティ目標について説明します。

着信要求の認証

転送プロバイダは、着信認証のメカニズムがその転送に適しているものはすべて自由に実装できます。たとえば、HTTP 転送は以下の認証方式をサポートします。

HTTPS 転送プロバイダは、上記の認証方法の他に、SSL クライアント認証をサポートします。HTTP 転送プロバイダおよび HTTPS 転送プロバイダのどちらも、匿名のクライアント要求をサポートします。

転送プロバイダは、適用可能な任意の転送レベル認証スキーマを実装します (存在する場合)。転送プロバイダがクライアントを認証する場合、weblogic.security.Security.runAs(subject) のスコープ内で TransportManager.receiveMessage() を呼び出し、AquaLogic Service Bus がクライアントの Subject オブジェクトを使用できるようにする必要があります。このメソッドについては、http://edocs.bea.com/wls/docs92/javadocs/weblogic/security/Security.html を参照してください。

ヒント : Java の Subject クラスについては、http://java.sun.com/j2se/1.5.0/docs/api/javax/security/auth/Subject.html を参照してください。

プロキシは、以下のように、この Subject を使用します。

転送プロバイダが認証をサポートしない、または匿名の要求をサポートする場合、要求をディスパッチする前に匿名サブジェクトがスレッド上にあることを確認する必要があります。通常、転送プロバイダは、匿名としてすでに実行しています。そうでない場合、プロバイダは以下を呼び出す必要があります。

Subject anonymous = SubjectUtils.getAnonymousUser() 
Security.runAs(anonymous, action)

SubjectUtils については、http://edocs.bea.com/wls/docs92/javadocs/weblogic/security/SubjectUtils.html を参照してください。

転送プロバイダは、着信クライアント認証のコンフィグレーションに必要な、任意の AquaLogic Service Bus Console コンフィグレーション ページの提供も行います。

転送プロバイダは、着信認証モデルを明確に記録しておく必要があります。

発信要求の認証

転送プロバイダは、発信認証のスキーマがその転送に適しているものはすべて自由に実装できます。転送 SDK には、ユーザ名およびパスワードによる発信認証、(双方向) SSL クライアント認証、および JAAS Subject 認証を容易に実現するための API が含まれています。

ユーザ名およびパスワードによる発信認証

AquaLogic Service Bus のサービス アカウントを使用して、ユーザ名およびパスワードによる発信認証を実装できます。サービス アカウントは、最上位の AquaLogic Service Bus リソースです。サービス アカウントは、AquaLogic Service Bus Console で作成および管理されます。転送プロバイダでは、それぞれの転送固有のコンフィグレーションを自由に設計し、サービス アカウントへの参照を含めることができます。このようにして、転送プロバイダは、AquaLogic Service Bus のサービス アカウントによって提供される資格管理メカニズムを利用することができます。

転送プロバイダでは、サービス アカウントのコンフィグレーションの詳細について懸念する必要はありません。サービス アカウントのタイプは、以下の 3 つです。

発信エンドポイントは、サービス アカウントへの参照を持つことができます。サービス アカウントへの参照は、転送固有のエンドポイントのコンフィグレーションに格納する必要があります。プロキシ サービスが、メッセージをこの発信エンドポイントにルーティングする場合、転送プロバイダは、サービス アカウントへの参照を CredentialCallback.getUsernamePasswordCredential(ref) に渡します。AquaLogic Service Bus は、サービス アカウントのコンフィグレーションに応じて、ユーザ名およびパスワードを返します。この方法には、ID の伝播と資格マッピングのコンフィグレーションを転送固有の詳細な作業から分離することで、転送 SDK を簡素化できるという利点があります。また、このコンフィグレーションの共有も可能になります。複数のエンドポイントが同じサービス アカウントを参照できます。

注意 : CredentialCallback オブジェクトは、TransportSender.getCredentialCallback() を呼び出すことにより転送プロバイダで使用できるようになります。

CredentialCallback.getUsernamePasswordCredential() は、weblogic.security.UsernameAndPassword インスタンスを返します。これは、ユーザ名およびパスワードを取得するためのメソッドを持つ簡単なクラスです。返されるユーザ名およびパスワードは、サービス アカウントのタイプによって異なります。サービス アカウントのタイプが静的である場合、固定されたユーザ名およびパスワードが返されます。サービス アカウントのタイプがマップされている場合、クライアント サブジェクトを使用してリモートのユーザ名およびパスワードがルックアップされます。サービス アカウントがパススルーである場合、クライアントのユーザ名およびパスワードが返されます。

注意 : 以下の場合、マップされたサービス アカウントは、CredentialNotFoundException を送出します。
注意 : AquaLogic Service Bus 2.5 では、パススルー サービス アカウントは、以下の 2 つのシナリオでのみ機能します。
注意 : それ以外の場合は、パススルー サービス アカウントは CredentialNotFoundException を送出します。

発信 SSL クライアント認証 (双方向 SSL)

AquaLogic Service Bus は、発信 SSL クライアント認証もサポートします。この場合、発信 SSL 要求を出すプロキシを、SSL 用の PKI キーペアを使用してコンフィグレーションする必要があります (これには、プロキシ サービス プロバイダへの参照が含まれますが、このドキュメントでは、詳細については取り上げていません。詳細については、AquaLogic Service Bus ユーザーズ ガイドを参照してください)。SSL クライアント認証用のキーペアを取得するには、転送プロバイダが CredentialCallback.getKeyPair() を呼び出す必要があります。この例として、HTTPS 転送プロバイダがあります。

発信 JAAS Subject 認証

一部の転送プロバイダは、認証トークンとして、シリアライズされた JAAS Subject を回線で送信します。着信サブジェクトを取得するには、転送プロバイダが CredentialCallback.getSubject() を呼び出す必要があります。

注意 : 戻り値は、匿名サブジェクトである場合があります。

リンクレベルまたは接続レベルの資格

一部の転送では、サービスに接続するために資格が必要になります。たとえば、FTP サーバへの認証には、FTP エンドポイントが必要になる場合があります。転送プロバイダは、静的なサービス アカウントを利用して、接続を確立するためのユーザ名およびパスワードを取得できます。これらの接続は、特定のクライアント要求の代わりとしての確立されるものではないため、この場合、マップされたサービス アカウントまたはパススルー サービス アカウントは使用できません。転送プロバイダでこのアプローチを採用する場合は、サービス アカウントへの参照を使用してエンドポイントをコンフィグレーションする必要があります。実行時に、転送プロバイダは、TransportManagerHelper.getUsernamePasswordCredential() を呼び出して、静的なサービス アカウントへの参照を渡す必要があります。

プロキシ サービスへの一貫したアクセス制御

AquaLogic Service Bus は、すべての着信要求についてプロキシ サービスへのアクセス制御を実施します。転送プロバイダでは、アクセス制御を実施するための、またはアクセス制御ポリシーを管理するためのインタフェースを提供する必要はありません。

注意 : アクセス制御ポリシーはほとんどの使用例を対象としていますが、転送プロバイダに固有の理由で、(AquaLogic Service Bus によって行われるアクセス制御チェックの他に) 独自のアクセス制御メカニズムが必要な場合は、それらを実装できます。この場合は、BEA 販売代理店にお問い合わせください。通常は、転送プロバイダで、AquaLogic Service Bus を使用してアクセス制御を処理する方法をお勧めします。

アクセスが拒否されると、TransportManager.receiveMessage() は、TransportException 内にラップされている AccessNotAllowedException を送出します。転送プロバイダは、TransportException の根本原因を確認します。根本原因が AccessNotAllowedException である場合、転送プロバイダは、特別なエラー処理を行う場合があります。たとえば、この場合、HTTP/S 転送プロバイダは HTTP 403 (forbidden) エラー コードを返します。

注意 : AquaLogic Service Bus は、アクセス制御の判断を行うために、認証プロバイダが要求ヘッダを使用できるようにします。

ID の伝播および資格マッピング

発信要求の認証」で説明したように、AquaLogic Service Bus には、3 つのタイプのサービス アカウントが用意されています。転送プロバイダは、サービス アカウントを利用して、発信認証のためのユーザ名およびパスワードにアクセスできます。サービス アカウントは、AquaLogic Service Bus の転送プロバイダに対し、すべての ID の伝播および資格マッピングの詳細を非表示にしています。

 


スレッディング モデル

この節では、AquaLogic Service Bus で使用されるスレッディング モデル、およびそのモデルが転送 SDK にどのように関係するかを説明します。この節の内容は以下のとおりです。

概要

図 2-5 に、1 つの着信メッセージを処理する仮想の転送エンドポイントを表す、AquaLogic Service Bus のスレッディング モデルを示します。

Servlet などのフロント エンド アーティファクトが、着信メッセージを取得します。要求を、発信エンドポイントにルーティングし、非同期的に送信できます。この時点で、スレッドは解放されます。その後しばらくして、コールバックを使用して、応答が AquaLogic Service Bus に送り返されます。応答が受信され、パッケージ化されて、AquaLogic Service Bus パイプラインに渡されます。その後、パイプラインが、応答をクライアントに送信する準備ができていることを着信エンドポイントに通知します。スレッドが使用できないのは必要な間のみであるため、この処理はスケーラブルです。

図 2-5 AquaLogic Service Bus のスレッディング モデルのサンプル

AquaLogic Service Bus のスレッディング モデルのサンプル

着信要求メッセージのスレッド

同じスレッドで以下のアクションが実行されます。

  1. 転送エンドポイントのフロント エンド アーティファクトが着信メッセージを受信します。このフロント エンド アーティファクトは、HTTP サーブレットや JMS メッセージ駆動型 Bean のインスタンスなどです。
  2. 転送エンドポイントの実装により、メッセージは TransportMessageContext オブジェクトにパッケージ化され、AquaLogic Service Bus ランタイムに渡されます。TransportMessageContext インタフェースの詳細については、「要求および応答メッセージのメタデータおよびヘッダの表現」を参照してください。
  3. パイプラインは、プロキシにコンフィグレーションされている要求パイプライン アクションを実行します。
  4. AquaLogic Service Bus パイプラインで着信メッセージを処理すると同時に、同じ (要求) スレッドで、AquaLogic Service Bus ランタイムは、発信メッセージを外部サービスに配信するよう、登録されている発信転送エンドポイント (このエンドポイントは、同じプロバイダで管理されていない場合もある) に要求します。
  5. その後しばらくして、外部サービスは、応答メッセージを配信するよう、発信エンドポイントに非同期的に要求します。発信エンドポイントは、転送固有のコールバック オブジェクトを使用して、事前に登録されている必要があります。
注意 : この時点で、最初の要求スレッドは解放され、別の要求が使用できるように WebLogic Server のスレッド プールに戻されます。

発信応答メッセージのスレッド

同じスレッドで以下のアクションが実行されます。

  1. 応答メッセージは、TransportMessageContext オブジェクトにパッケージ化され、応答処理のために AquaLogic Service Bus ランタイムに戻されます。この処理は、要求スレッドとは別のスレッドで実行されます。新しいスレッドは、応答スレッドと呼ばれます。
  2. 応答メッセージが処理された後、AquaLogic Service Bus ランタイムは、応答を呼び出し元に送り返すタイミングであることを通知するよう、InboundTransportMessageContext オブジェクトに要求します。InboundTransportMessageContext インタフェースの詳細については、「要求および応答メッセージのメタデータおよびヘッダの表現」を参照してください。
  3. 転送プロバイダが、非同期の (非ブロッキング) 発信呼び出しをネイティブに実装していない場合は、着信要求メッセージを受信したスレッドとは別のスレッドで、AquaLogic Service Bus ランタイムに応答を返す必要があります。これを行うために転送プロバイダは、要求スレッドでブロッキング呼び出しを実行し、転送 SDK のヘルパー メソッドを使用して、AquaLogic Service Bus ランタイムに応答を返します。

    たとえば、EJB 転送プロバイダは、非同期 (非ブロッキング) の発信呼び出しを実装していません。基礎となる API はブロッキング API です。これに対処するには、プロバイダがブロッキング呼び出しを行い、その後で、TransportManagerHelper.schedule() を使用して処理に対する応答をスケジュールします。EJB 転送プロバイダの詳細については、AquaLogic Service Bus ユーザーズ ガイドの「EJB 転送」を参照してください

非同期のサポート

転送サブシステムは、意図的に、AquaLogic Service Bus と非同期的に対話するようになっています。これは、非同期での動作が、同期での動作よりもスケーラブルであるため望ましいからです。非同期の対話用に 1 つ、および同期の対話用に 1 つと、2 つの別々の API を作成するのではなく、AquaLogic Service Bus ランタイムでは非同期の対話が必要です。この処理は、ブロッキング呼び出しやコールバックでの応答をポストするなどの方法により、転送開発者が行う必要があります。いずれにせよ、応答は、要求とは別のスレッドで実行する必要があります。非同期の発信呼び出しをサポートする AquaLogic Service Bus の転送プロバイダのリストについては、表 2-2 を参照してください。

表 2-2 AquaLogic Service Bus の転送プロバイダによる非同期のサポート
転送プロバイダ
非同期の非ブロッキング発信呼び出しのサポート
HTTP/HTTPS
サポートする
JMS
サポートする
ファイル
該当しない (一方向のみ。応答は送信されない)
電子メール
該当しない (一方向のみ。応答は送信されない)
FTP
該当しない (一方向のみ。応答は送信されない)
Tuxedo
サポートする
EJB
サポートしない
ソケット
サポートする

パブリッシュおよびサービス コールアウトのスレッディング

図 2-5 に示すスレッド ダイアグラムは、ルーティングに焦点を当てたものです。転送サブシステムは、要求または応答パイプラインの処理中に実行される AquaLogic Service Bus のパブリッシュ アクションとサービス コールアウト アクションに対して同じように動作します。これらのアクションは、転送サブシステムの範囲外および AquaLogic Service Bus パイプラインの範囲内で実行されます。そのため、パブリッシュおよびサービス コールアウトのスレッディング動作と転送プロバイダのスレッディング動作には違いがいくつかあります。

ただし、以下の場合に注意してください。

ヒント : サービス コールアウト アクションにより、ユーザは、AquaLogic Service Bus にすでに登録されているプロキシまたはビジネス サービスに対し、同期 (ブロッキング) 呼び出しをコンフィグレーションすることができます。メッセージの対象サービスを特定し、そのサービスへメッセージをパッケージ化し、送信する方法をコンフィグレーションするには、パブリッシュ アクションを使用してください。サービス コールアウト アクションおよびパブリッシュ アクションの詳細については、AquaLogic Service Bus Console のオンライン ヘルプおよび AquaLogic Service Bus ユーザーズ ガイドを参照してください

 


メッセージ コンテンツの設計

この節の内容は以下のとおりです。

概要

転送プロバイダには、メッセージ コンテンツの独自のネイティブ表現があります。たとえば、HTTP 転送は java.io.InputStream を使用し、JMS は、さまざまなタイプの Message オブジェクトがあります。また、Tuxedo にはバッファがあり、WLS Web サービスのスタックは SAAJ を使用します。ただし、プロキシ サービスの実行時は、コンテンツのネイティブ表現は、メッセージ コンテキストです。AquaLogic Service Bus は、InputStream からメッセージ コンテキストへの、またはその逆などの一部の一般的な変換シナリオをサポートしますが、転送での表現とメッセージ コンテキストの間の変換は、最終的には転送プロバイダが行います。

通常、転送 SDK が、転送の 2 つの異なるコンテンツ表現を直接変換することはありません。ただし、2 つの転送が互換性のある表現を使用していて、コンテンツを再エンコードする必要がない場合は、SDK によって、(たとえば、着信ファイル転送から発信 HTTP 転送に FileInputStream を渡すことにより) ソース コンテンツを直接パススルーできます。ただし、ソース コンテンツで何らかの処理が必要な場合は、最初にソース コンテンツをメッセージ コンテキストに復号化し、その後で標準のメカニズムを使用して送信転送用のコンテンツを生成した方が適切です。

Source および Transformer

コンテンツは、Source インタフェースのインスタンスとして表されます。TransportSender や TransportMessageContext などのメッセージ コンテンツを処理する転送 SDK インタフェースは、すべてメッセージ ペイロードを渡す際に、Source インタフェースを使用します。Source における要件はごくわずかです。Source は、基本となる Source インタフェースで定義されている 2 つのメソッドを使用した、バイト単位のストリームへのプルベースおよびプッシュベースの変換をサポートする必要があります。Source は、シリアライゼーション中に、TransformOptions パラメータで指定されている、文字セット エンコーディングなどのさまざまなトランスフォーメーションのオプションを考慮しない場合があります。

すべての Source オブジェクトは基本的なシリアライゼーション インタフェースを実装する必要がありますが、Source オブジェクトの基礎となる表現は実装固有のものです。そのため、InputStream、JMS Message オブジェクト、String、または特定の転送に最も適している表現に基づいた Source オブジェクトを使用できます。通常、Source を実装することで、基本的なシリアライゼーション メソッドだけでなく、基になるコンテンツに直接アクセスできるようになります。たとえば、内部で String オブジェクトを使用してそのコンテンツを格納する StringSource は、内部データにアクセスするための getString() メソッドを提供します。その後、Source の最終的なコンシューマは、これらのソース固有の API を呼び出して、基礎となるコンテンツを抽出し、シリアライゼーションのオーバーヘッドを回避することができます。

また、Transformer オブジェクトを使用して、Source を他のタイプの Source に変換することもできます。転送プロバイダなどの Source コンシューマが、認識できない Source インスタンスを受け取った場合は、多くの場合、認識できる Source インスタンスに変換できます。その後、ソース固有の API を使用して、認識できる Source から基になるコンテンツを抽出できます。ただし、転送プロバイダは多くの場合、単に基本的なシリアライゼーション メソッドを使用してコンテンツをシリアライズし送信します。「Source および Transformer クラスとインタフェース」も参照してください。

Source および MessageContext オブジェクト

Source は、転送レイヤとバインディング レイヤの間の一般的なコンテンツ表現です。バインディング レイヤは、転送レイヤで使用される Source 表現と実行時にパイプラインで使用されるメッセージ コンテキストとの間でコンテンツを変換するエンティティです。変換がどのように行われるかは、サービスのタイプ (そのバインディングのタイプ) と添付の有無によって異なります。厳密には転送 SDK の役割ではありませんが、独自の Source オブジェクトを定義しているすべての転送プロバイダは、この変換プロセスを認識している必要があります。

添付が存在しない場合、受信した Source は単にコアとなるメッセージ コンテンツを示します。受信した Source を特定のタイプの Source に変換し、その後で基になるコンテンツを抽出することで MessageContext が初期化されます。たとえば、XML ベースのサービスの場合、受信した Source は XmlObjectSource に変換されます。その後、XmlObjectSource から XmlObject が抽出され、$body コンテキスト変数内でペイロードとして使用されます。同様に、SOAP サービスは XmlObjectSource に変換されます。ただし、<SOAP:Header> および <SOAP:Body> 要素を抽出して $header および $body コンテキスト変数を初期化できるようにするために、抽出された XmlObject が SOAP Envelope である必要がある点が異なります。

定義された一連のサービス タイプで使用される標準的な Source のタイプを以下に示します。

バイナリ サービスの場合、Source の変換は行われません。代わりに、Source は、SourceRepository に登録され、結果の <binary-content/> XML は、$body 内でペイロードとして使用されます。

添付が存在する場合、Source は最初に MessageContextSource に変換されます。MessageContextSource から、2 つのタイプの Source オブジェクトが取得されます。1 つが添付で、もう 1 つがコア メッセージです。コア メッセージの Source は、前述のとおり処理されます。添付を表す Source は、AttachmentsSource に変換されます。AttachmentsSource から、XML が取得され、$attachments コンテキスト変数、および任意のバイナリの添付コンテンツを表す登録済みの Source を含む SourceRepository の初期化に使用されます。図 2-6 に、このプロセス全体を示します。

図 2-6 添付のフロー

添付のフロー

転送レイヤに渡すために MessageContext 内のデータから Source を作成する場合にも、同様の変換が実行されます。コア メッセージは、サービスのタイプの標準的な Source に変換できる Source インスタンスで表現されています。ほとんどの場合、Source は、すでに標準的な Source のインスタンスになっていますが、必ずしもそうであるとは限りません。添付が存在する場合、転送レイヤに渡される Source は、MessageContextSource インスタンスに変換できる Source になります。転送プロバイダが、事前定義された転送ヘッダとして Content-Type をサポートする場合、一般的に、配信された Source は MessageContextSource のインスタンスになります。それ以外の場合、配信された Source は MimeSource のインスタンスであることが多いですが、これも MessageContextSource に変換できます。

この違いの理由は、転送ヘッダとして Content-Type をネイティブにサポートする転送では、ペイロードではなく、転送ヘッダにトップレベルの MIME ヘッダが含まれている必要があるためです。この例としては、HTTP および電子メールがあります。Content-Type をネイティブにサポートしない転送では、これらのトップレベルの MIME ヘッダがペイロードに含まれている必要があります。Content-Type ヘッダは、複数の MIME パッケージのデコードに不可欠であるためです。

組み込みのトランスフォーメーション

以下の一覧は、組み込みのトランスフォーマによって提供される、サポートされているトランスフォーメーションのセットを示しています。左側にある Source 名の列は最初の Source のタイプを示し、上にある Source 名の行はターゲットの Source のタイプを示しています。行 R および列 C にある「X」は、最初の Source R からターゲットである Source C へ直接変換できることを示しています。たとえば、StringSource から XmlObjectSource への変換を処理する組み込みのトランスフォーマは存在しますが、StringSource から AttachmentsSource に変換できるトランスフォーマは存在しません。通常、これらのトランスフォーマは両方の Source のタイプで使用される内部データ表現の知識を利用します。

図 2-7 トランスフォーメーションの一覧

トランスフォーメーションの一覧

特に興味深いのは、一覧中の最初の「X」の行です。これは、サポートされている任意の Source から特定の Source へのトランスフォーメーションを示しています。たとえば、XmlObjectSource から ByteArraySource への変換を処理するトランスフォーマは特に存在しませんが、任意の Source のインスタンスから ByteArraySource への変換を処理するトランスフォーマは存在します。これらの一般的なトランスフォーメーションは、最初の Source のタイプの知識なしで実行されます。ただし、代わりに、すべての Source で実装されている、getInputStream() および writeTo() などの基本的なシリアライゼーション メソッドに基づいて実行されます。そのため、最終的には、XmlObjectSource から ByteArraySource へ変換することはできますが、これには、XmlObjectSource の内部情報の特定の知識は使用されません。

注意 : 転送で実装されているカスタム Source の多くは、(基礎となるデータが構造化されていないバイトの収集である場合は特に) これらの一般的なトランスフォーメーションで処理できます。たとえば、ファイル転送は、ディスク上のファイルから直接コンテンツを取り出すカスタム Source を使用します。ただし、データは構造のない単なるバイトのセットであるため、XmlObjectSource などへのカスタム トランスフォーメーションを実行する必要はありません。Source から XmlObjectSource への一般的なトランスフォーメーションで、すべての Source が実装している基本的なシリアライゼーション メソッドのみを使用して、このカスタム FileSource を処理することができます。

詳細については、「Source および Transformer クラスとインタフェース」を参照してください。


  ページの先頭       前  次