この章では、JEJBトランスポートの概要と、Service Busでトランスポートを使用してPlain Old Java Object (POJO)を処理する方法について説明します。
この章の内容は次のとおりです。
JEJBトランスポートを使用すると、Service Busを介してPlain Old Java Object (POJO)を渡すことができます。たとえば、EJBを使用してリモートEJB操作または非EJBサービスを呼び出すことができます。または、非EJBリクエストでEJB操作を呼び出すことができます。詳しい使用例を「使用例」で説明します。
J2EEクライアントに対して、JEJBプロキシ・サービスはステートレス・セッションBeanのように見えます。JEJBプロキシ・サービスは、メソッド引数を受け取ると、そのXML表現をパイプラインの$body
変数に渡します。POJO引数は、パイプライン内のオブジェクト・リポジトリに格納された実際のPOJOの場所を含む、XMLフラグメントとして表されます。XML引数は、値または参照(オブジェクト・リポジトリに格納される実際のオブジェクトを参照する)として渡すことができます。プリミティブ型は常に値として渡されます。
パイプライン内のPOJOの詳細は、「body変数内のJavaコンテンツ」および「JavaコールアウトおよびPOJOの使用方法」を参照してください。
JEJBトランスポートは常に非同期であり、メッセージング・パターンはリクエスト/レスポンスです。デプロイメントに際して、Service BusはJEJBプロキシ・サービスをエンタープライズ・アーカイブ(EAR)として自動的にパッケージ化します。
EJBトランスポート(ビジネス・サービスのみに対応)は、Java Web Services (JWS)フレームワークを介してリモートEJBをよびだします。JEJBトランスポート(リモートEJBや外部サービスをPOJOを使用して呼び出すことができる)は、RMIシリアライゼーション/デシリアライゼーション・サイクルを使用して、Service Busを介してターゲットEJBメソッドにPOJOを直接渡します。EJBトランスポートには「トランザクションをサポートする」フラグがありますが、すべてのプロキシ・サービスでトランザクションのサポートが提供されるため、JEJBビジネス・サービスではトランザクション・オプションが必要ありません。
プロキシ・サービスとビジネス・サービスのために、JEJBトランスポートは、パイプラインに渡すメッセージを記述するためだけに使用されるリテラル・エンコーディングのドキュメント形式WSDLファイルを生成します。このWSDL形式を使用すると、Service BusのWSDL機能(操作ごとのモニターなど)を利用できます。表30-1で説明するように、「値でXMLBeansを渡す」
オプションを使用してPOJO引数をメッセージにインライン指定すると、WSDLファイルに定義されるメッセージ構造は、実行時の実際のパイプライン・メッセージと異なる可能性があります。
XMLBeansパラメータ・タイプに対するパイプライン・メッセージ・フォーマットの動作は次のとおりです。
プロキシ・サービス
リクエスト・パラメータ: 「値でXMLBeansを渡す」
がtrueの場合、パイプライン・メッセージのリクエスト・パラメータはインラインXMLオブジェクトを参照します。これ以外の場合は、java-content ref
を参照します。
レスポンス・パラメータ: レスポンスはビジネス・サービスのいずれかの形式に基づくため、レスポンスはインラインXMLオブジェクトまたはjava-content ref
を参照します。
ビジネス・サービス
レスポンス・パラメータ: 「値でXMLBeansを渡す」
がtrueの場合、パイプライン・メッセージの戻りパラメータはインラインXMLオブジェクトを参照します。そうでない場合は、java-content ref
を参照します。
リクエスト・パラメータ: リクエストはプロキシ・サービスのいずれかの形式に基づくため、パイプライン・メッセージのリクエスト・メソッド・パラメータは、インラインXMLオブジェクトまたはjava-content ref,
を参照できます。
ここでは、JEJBトランスポートがどのようにエラーを処理するかを説明します。
JEJBトランスポートは、リクエスト例外をオブジェクト・リポジトリに格納し、$fault
変数を介してJEJBプロキシ・サービスに伝播します。$fault
変数には、<java-exception> <java-content ref="jcid"/> </java-exception>
要素(jcid
はオブジェクト・リポジトリに格納されている例外インスタンスへの参照)内の例外インスタンスの場所が含まれます。
JEJBプロキシ・サービスでユーザー例外をクライアントに伝播するには、レスポンスが次のいずれかの形式であることが必要です。jcid
は常に、オブジェクト・リポジトリ内のエラーへの参照です。
env:Envelope/env:Fault/detail/mc:java-exception
<detail> <mc:java-exception> <mc:java-content ref="jcid"/> </mc:java-exception> ... </detail>
env:Envelope/env:Fault/detail/mc:fault/mc:java-exception
<detail> <mc:fault xmlns:mc="http://www.bea.com/wli/sb/context"> <mc:java-exception> <mc:java-content ref="jcid"/> </mc:java-exception> ... </mc:fault> </detail>
env:Envelope/ env:Fault/detail/mc:fault/mc:details/con1:ReceivedFaultDetail/con1:detail/mc:java-exception
<con:details> <con1:ReceivedFaultDetail xmlns:con1="http://www.bea.com/wli/sb/stages/transform/config"> <con1:faultcode>soapenv:Server</con1:faultcode> <con1:faultstring>checkExceptionConversion</con1:faultstring> <con1:detail> <mc:java-exception> <mc:java-content ref="jcid"/> </mc:java-exception> </con1:detail> </con1:ReceivedFaultDetail> </con:details>
独自の例外を生成して呼出し元に戻す場合は、パイプラインのJavaコールアウトで例外を生成します。
失敗時の返信のためにエラー・ハンドラでJavaコールアウトまたはサービス・コールアウトを構成する場合、前に説明したフォルト構文のいずれかに従って$body
を指定します。
この項では、JEJBのプロキシ・サービスとビジネス・サービスを作成する前に知っておく必要があることについて説明します。
JEJBサービスを使用する場合、JEJBのプロキシ・サービスとビジネス・サービスに関して、EJBの呼出しと操作を表すPOJOを作成し、パッケージ化する必要があります。次のガイドラインに従います。
タイプjava.io.Serializable
のインタフェースを定義し、必要なヘルパー・クラス(ビジネス例外など)を組み込みます。このインタフェースが「JEJBトランスポートのエンドポイントURI」で説明するRMIプロトコルの1つに対して有効である場合、またはJMSメッセージに対して有効である場合(EJBを呼び出すためにJMSを使用しているとき)、クラスを拡張する必要はありません。
必須ではありませんが、インタフェースをEJB 2.1仕様の定義に従ってリモート・インタフェースにしたり、メソッドをjavax.ejb.Remote
注釈で注釈付けして、そのメソッドをEJB 3.0ビジネス・インタフェースとして指定できます。単純なPOJOインタフェース(EJBリモート・インタフェース以外)またはjavax.ejb.Remote
注釈を含むインタフェースの場合、JEJBトランスポート・プロバイダはJEJBプロキシ・サービスから3.0 EJBインタフェースを生成します。リモート・インタフェースの場合、JEJBトランスポート・プロバイダはJEJBプロキシ・サービスから2.1 EJBインタフェースを生成します。
引数として受信されるオブジェクトは、Javaコールアウト・アーカイブ・リソースのいずれかの必須クラスに渡される必要があります。
すべてのタイプのすべての配列はPOJOとみなされます。
不要なシリアライゼーション/デシリアライゼーション・サイクルを回避するために、JavaコールアウトをサポートするService Busアーカイブ・リソースとしてアップロードされるJARファイルを複製しないようにします。すべてのアーカイブ・リソース・クラスを1つのJARファイルにパッケージ化して、複数のJavaコールアウトがオブジェクトのシリアライゼーション/デシリアライゼーションを行わないようにします。
インタフェースと依存クラスを1つのクライアントJARファイルにパッケージ化し、そのJARファイルをService Busにインポートします。これはサービスを構成するときに選択するクライアントJARファイルですが、スタブを含まないため、技術的には完全に展開されたEJBクライアントJARファイルではありません。JEJBプロキシ・サービスが作成されてアクティブ化されるまでは、実際のBean (WebLogic Serverスタブ生成)は存在しません。
JNDIプロバイダ・リソースでは、リモートOracle WebLogic ServerドメインのJNDIツリーにバインドされているEJBスタブを取得するために使用される通信プロトコルおよびセキュリティ資格証明を指定できます。通常、ターゲットEJBはService Busと同じドメイン内にはありません。この場合、JNDIプロバイダ・リソースを登録する必要があります。EJBが同じドメイン内にある場合、プロバイダを定義して資格証明を指定し、スタブ・キャッシングを利用できます。ただし、これは省略可能です。
JNDIプロバイダには、リモート接続とEJBスタブのための高性能なキャッシング・メカニズムがあります。Service BusからOracle WebLogic Serverドメインへの推奨される通信プロトコルは、t3
またはt3s
です。メッセージがファイアウォールを通過する必要がある場合は、HTTPトンネリングを使用できます。
注意:
WebLogic Serverの外部JNDIプロバイダを使用できますが、使用しないことをお薦めします。
このトランスポートでは、双方向SSLまたはクライアント証明書によるJNDIツリーのルックアップまたはEJBのメソッドへのアクセスをサポートしません。
Service BusへのJNDIプロバイダ・リソースの登録と構成の詳細は、「JNDIプロバイダ・リソースの操作」を参照してください。JNDIツリーの設定の詳細は、『Oracle WebLogic Server JNDIアプリケーションの開発』を参照してください。
プロキシ・サービスとビジネス・サービスでのJEJBトランスポートの使用がサポートされている使用例を次に示します。各使用例には実装のガイドラインが含まれており、「JEJBトランスポート構成のリファレンス」の全般的なサービス構成と組み合せて使用できます。
図30-1に示すように、Service Busを介してEJBで外部サービスを呼び出すことができます。
図30-1では、JEJBプロキシ・サービスはEJBクライアント・インタフェースに対してステートレス・セッションBeanとして機能します。プロキシ・サービスのJEJBトランスポート・プロバイダは、クライアントJARとパイプラインのリモート/ビジネス・インタフェースからステートレス・セッションEJBを生成します。次に、エンドポイントURIに指定されたJNDIアドレスにEARとしてデプロイします。
注意:
JNDIエントリが変更されないように保護するポリシーをインストールしてください。
EJBは、プロキシ・サービスEJBクライアントJARによって提供されるリモート・インタフェースをコールし、トランザクションとセキュリティの詳細をプロキシ・サービスに渡します。
EJBクライアント・インタフェースはPOJOであり、その引数はJEJBトランスポート・プロバイダがWSDLファイルとして表し、プロキシ・サービスの$body
変数にXMLとして渡します。$body
コンテンツのイントロスペクションを実行して、メッセージを必要な形式に変換してから、ビジネス・サービスに渡し、外部サービスを呼び出すことができます。実際のPOJOはオブジェクト・リポジトリに格納され、$body
のXMLが<java-content ref="">
要素で参照します。
レスポンスでは、呼出し元のEJBメソッドに渡すために、レスポンスをEJB戻り形式に変換するJavaコールアウトを提供します。プロキシ・サービスの生成されたWSDLファイルを表示して、予期されるメッセージ・フォーマットを確認します。
注意:
プロキシ・サービスのパイプラインで、Javaコールアウト、ビジネス・サービスまたは別のプロキシ・サービス(サービス・コールアウトまたはパブリッシュ・アクションを使用)にPOJO引数を渡すことができます。
図30-2に示すように、Service Busを介して非EJBクライアントでEJBを呼び出すことができます。
図30-2では、非EJBクライアントが、リクエストと一致するトランスポートで構成されたプロキシ・サービス(たとえば、JMSトピックまたはキューで呼び出すJMSプロキシ・サービス)を呼び出します。
リクエストでJavaコールアウト(リクエストを$body
変数のEJBコールのXML表現に変換する)を構成します。操作を$operation
変数に設定します。ビジネス・サービスの生成されたWSDLファイルを表示して、予期されるメッセージ・フォーマットを確認します。JEJBビジネス・サービスは、生成されたWSDLファイルを使用して着信メッセージをEJBリモート・インタフェースにマップし、リモートEJBメソッドを直接呼び出します。
図30-3に示すように、Service Busを介してEJBでEJBを呼び出すことができます。
図30-3では、EJBコールはプロキシ・サービスとビジネス・サービスを介して渡され、別のEJBメソッドを呼び出します。Service Busの外部に直接RMIコールを行うかわりに、このアーキテクチャではService Busの機能(メッセージ・ルーティング、UDDI統合、アラート、モニター、レポート、結果キャッシングなど)を利用します。
プロキシ・サービスのJEJBトランスポート・プロバイダは、クライアントJARファイルとパイプラインのリモート/ビジネス・インタフェースからステートレス・セッションEJBを生成します。次に、エンドポイントURIに指定されたJNDIアドレスにEARファイルとしてデプロイします。
実行時に、JEJBプロキシ・サービスはPOJOをメソッドの引数として受け取ってオブジェクト・リポジトリに格納し、生成されたプロキシ・サービスWSDLファイルに基づいて、プロキシ・サービスの$body
変数にPOJOのXML表現を生成します。プロキシ・サービスはメッセージをビジネス・サービスに渡します。ビジネス・サービスは、生成されたWSDLファイルを使用してメッセージをリモート・インタフェースにマップし、リモート・メソッドを直接呼び出します。
JEJBプロキシ・サービスのプロパティは、UDDIレジストリとの間でパブリッシュおよびインポートできます。
JEJBプロキシ・サービスは次のプロパティをUDDIレジストリにパブリッシュします。
URI
EJB仕様バージョン
クライアントJar
ホーム・インタフェース(EJB 2.1のみ)
リモート・インタフェース(EJB 3.0のビジネス・インタフェース)
メソッド名。操作別名、パラメータおよび戻り値の詳細は含まれません。メソッド名は、すべてのメソッド・シグネチャが付けられた1つのプロパティで渡されます。メソッド・シグネチャは番号(#)記号で区切られます。
ここでは、JEJBトランスポートがUDDIレジストリからのサービス・インポートを処理する方法を説明します。
URI: JEJBトランスポート・プロバイダは、UDDIレジストリにあるURIプロパティのホストおよびポート情報を、サーバーに登録されているJNDIプロバイダ・リソースと照合しようとします。
トランスポート・プロバイダがJNDIプロバイダを見つけられない場合、インポートは失敗します。ただし、JNDIプロバイダが見つからなくても、ホストおよびポートがlocalhostのIPとリスニング・ポートと一致する場合、結果のビジネス・サービスはローカルになります(JNDIプロバイダではありません)。
クライアントJAR: トランスポート・プロバイダがクライアントJARファイルをダウンロードし、マニフェスト・クラスパスがJARファイルに存在する場合は、対応するJARリソースを同じディレクトリ構造に作成します。リストの最初のURIがルート・クライアントJARファイルです。JARファイルにマニフェスト・クラスパスが存在しない場合は、リソースJARファイルをルートJARファイルに手動で追加する必要があります。インポートされたクライアントJARファイルのリソースが、ドメインの別のリソースと同じ名前である場合、インポートされたリソースによって既存のリソースが上書きされます。
インポートするクライアントJARファイルがドメインに存在していないことを確認します。
メソッド名: 対応するプロパティに含まれるメソッドは、エンドポイントの構成で自動的に選択されます。他のすべてのメソッドは除外としてマークされます。
この項では、エンドポイントURIの形式と環境値、およびプロキシ・サービスとビジネス・サービスにおけるJEJBトランスポートの構成について説明します。
エンドポイントURIの形式は、プロキシ・サービスとビジネス・サービスのどちらを構成するかによって異なります。
注意:
JEJBサービスでは同じ場所に配置した呼出しはサポートされません。
JEJBプロキシ・サービスに対して構成されるURIは、JEJBトランスポートによって生成されるステートレス・セッションBeanをクライアントJARのリモート/ビジネス・インタフェースで探すためのグローバルJNDI名になります。URL形式はejb_jndi_name
.です。
注意:
EJB 3.0の場合、ejb_jndi_name
は生成されるBeanの@javax.ejb.Stateless
注釈のmappedName属性です。生成されるEJBサービスのルックアップJNDI名の接尾辞は#interface_class
であり、これはビジネス・インタフェースの完全修飾名です。
次のようにJEJBプロキシ・サービスにアクセスできます。
EJB 2.1: protocol://host:port/ejb_jndi_name
EJB 3.0: protocol://host:port/ejb_jndi_name#interface_class
protocol
は次のRMIプロトコルのいずれかです。
iiop/iiops
:サーバーにとらわれない汎用プロトコルです。
t3/t3s
: Oracle WebLogic Serverで使用されます。
http/https
: トンネリングおよびOracle WebLogic Serverで使用します。
次に例を示します。
EJB 2.1: t3://localhost:7001/osb.jejb.myJejbProxy
EJB 3.0: t3://localhost:7001/osb.jejb.myJejbProxy#com.example.MyEjb3
JEJBのビジネス・サービスのエンドポイントURIには、次の形式を使用します。
jejb:jndi_provider_name:ejb_jndi_name
jndi_provider_name
はリモートJNDIコンテキスト、ejb_jndi_name
はリモートEJBのJNDI名です。
次に例を示します。
EJB 2.1: jejb:myProvider:osb.jejb.myJejbBiz21
EJB 3.0: jejb:myProvider:myBiz31#osb.jejb.myJejbBiz
ここで、#osb.jejb.myJejbBiz
は完全修飾されたビジネス・インタフェースです。
EJBがIBM WebSphere上で実行中の場合は、ejb_jndi_name
を次のいずれかの形式にしてください。
cell/nodes/node_name/servers/server_name/ejb_jndi_name
または
cell/clusters/cluster_name/ejb_jndi_name
詳細は、IBM WebSphereのドキュメントを参照してください。
次の表に、プロキシ・サービス用のJEJBトランスポートの構成に使用するプロパティを示します。プロキシ・サービスを作成する手順については、「プロキシ・サービスの作成と構成」を参照してください。
表30-1 プロキシ・サービス用のJEJBトランスポート・プロパティ
プロパティ | 説明 |
---|---|
ディスパッチ・ポリシー |
このエンドポイントのディスパッチ・ポリシーに使用するWebLogic Serverワーク・マネージャのインスタンスを選択します。デフォルトのワーク・マネージャは、他にワーク・マネージャがない場合に使用されます。 ワーク・マネージャの詳細は、次の説明を参照してください。
|
EJB仕様バージョン |
リモートEJBインタフェースのEJBバージョンを選択します。 |
値でXMLBeansを渡す |
トランスポートによってPOJO引数(XMLObject)のインラインXML表現を生成する場合は、このオプションを選択します。この引数のパラメータは、XQuery式でアクセスおよび操作できます。 注意: 値で渡されたXMLObjectの場合、型情報はインラインでは利用できません。このオプションを使用する場合、プロキシ・サービス・パイプラインのJavaコールアウトで型付きのXMLObjectを引数として渡すことはできません。 参照でPOJOを渡す場合は、このオプションを選択しないでください。こうすることでパフォーマンスも向上します。 詳細は、「JEJBトランスポートによるWSDLの生成」を参照してください。 |
トランザクション属性 |
トランザクションを処理するために次のいずれかのオプションを選択します。
|
リモート・クライアント・タイムアウト |
リモートRMIクライアントがタイムアウトまでに待機する時間の長さを秒数で指定します。 |
クライアントJar |
「参照」をクリックし、表示されるリストからEJBクライアントJARリソースを選択します。クライアントJARには、リモートEJBのリモートまたはビジネス・インタフェースが含まれます。クライアントJARは、汎用アーカイブ・リソースとして登録されます。 |
ホーム・インタフェース |
EJB 2.1専用。クライアントJARによって設定されるオプションから必須のEJBHomeインタフェースを選択します。 |
リモート・インタフェース |
EJB 2.1専用。このフィールドには、ホーム・インタフェースの構成に基づいて、自動的に情報が表示されます。 |
ビジネス・インタフェース |
EJB 3.0専用。クライアントJARファイルから呼び出すビジネス・インタフェースを選択します。 |
対象ネームスペース |
生成されるWSDLファイルのターゲット・ネームスペース。このフィールドにはJARからピックアップされた情報が自動的に移入されます。 |
メソッド |
使用可能なメソッドのリストから、必要なメソッドを選択します。使用可能なメソッドは、使用するJARファイルによって異なります。デフォルトでは、すべてのメソッドが選択されています。メソッドを開くと、デフォルトのパラメータ値を編集できます。 任意のメソッドのデフォルトの操作名を変更できます。デフォルトでは、操作名はメソッド名です。EJBに同じ名前のメソッドが含まれている場合(オーバーロード)、一意になるように操作名を変更する必要があります。WSDLファイルでは一意の操作名が必要です。 |
次の表に、ビジネス・サービス用のJEJBトランスポートの構成に使用するプロパティを示します。詳細は、「ビジネス・サービスの作成と構成」を参照してください。
表30-2 ビジネス・サービスのためのJEJBトランスポート構成
オプション | 説明 |
---|---|
ディスパッチ・ポリシー |
このエンドポイントのディスパッチ・ポリシーに使用するWebLogic Serverワーク・マネージャのインスタンスを選択します。デフォルトのワーク・マネージャは、他にワーク・マネージャがない場合に使用されます。 ワーク・マネージャの詳細は、次の説明を参照してください。
|
EJB仕様バージョン |
リモートEJBインタフェースのEJBバージョンを選択します。 |
値でXMLBeansを渡す |
トランスポートによってPOJO引数(XMLObject)のインラインXML表現を生成する場合は、このオプションを選択します。この引数のパラメータは、XQuery式でアクセスおよび操作できます。 注意: 値で渡されたXMLObjectの場合、型情報はインラインでは利用できません。このオプションを使用する場合、プロキシ・サービス・パイプラインのJavaコールアウトで型付きのXMLObjectを引数として渡すことはできません。 参照でPOJOを渡す場合は、このオプションを選択しないでください。こうすることでパフォーマンスも向上します。 参照でPOJOを渡す場合は、このオプションを選択しないでください。こうすることでパフォーマンスも向上します。 詳細は、「JEJBトランスポートによるWSDLの生成」を参照してください。 |
呼出し元のサブジェクトを渡す |
このオプションは、サービス・アカウントを選択するかわりの手段として選択します。このオプションを選択すると、EJBを呼び出すときに、Service Busがプロキシ・サービスの認証済サブジェクトを渡します。 |
サービス・アカウント |
サービスにアクセスするための認証に使用するサービス・アカウントを入力します。サービス・アカウントを指定しない場合は、匿名サブジェクトが使用されます。Basic認証を選択した場合、このフィールドは必須です。 詳細は、「サービス・アカウントの操作」を参照してください。 |
クライアントJar |
「参照」をクリックし、表示されるリストからEJBクライアントJARリソースを選択します。クライアントJARには、リモートEJBのリモートまたはビジネス・インタフェースが含まれます。クライアントJARは汎用アーカイブ・リソースとして登録されます。 |
ホーム・インタフェース |
EJB 2.1専用。クライアントJARによって設定されるオプションから必須のEJBHomeインタフェースを選択します。 |
リモート・インタフェース |
EJB 2.1専用。このフィールドには、ホーム・インタフェースの構成に基づいて、自動的に情報が表示されます。 |
ビジネス・インタフェース |
EJB 3.0専用。クライアントJARファイルから呼び出すビジネス・インタフェースを選択します。 |
対象ネームスペース |
生成されるWSDLファイルのターゲット・ネームスペース。このフィールドにはJARからピックアップされた情報が自動的に移入されます。 |
メソッド |
使用可能なメソッドのリストから、必要なメソッドを選択します。使用可能なメソッドは、使用するJARファイルによって異なります。デフォルトでは、すべてのメソッドが選択されています。メソッドを開くと、デフォルトのパラメータ値を編集できます。 任意のメソッドのデフォルトの操作名を変更できます。デフォルトでは、操作名はメソッド名です。EJBに同じ名前のメソッドが含まれている場合(オーバーロード)、一意になるように操作名を変更する必要があります。WSDLファイルでは一意の操作名が必要です。 |
JEJBトランスポートでは、JEJBサービスのために次の環境値が格納されています。
サービスURI
ワーク・マネージャ
UDDI自動パブリッシュ(プロキシ・サービス)
サービス・アカウント(ビジネス・サービス)
これらの値は、ビジネス・サービスとプロキシ・サービスのトランスポート・プロパティに対応しています。詳細は、「JEJBトランスポート構成のリファレンス」を参照してください。