ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Service Bus開発者ガイド
11g リリース1(11.1.1.4.0)
B61435-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

40 Eclipse用のOracle Service Busトランスポートの開発

この章では、Oracle Service Busデザイン・タイム用のトランスポートを開発するためのベスト・プラクティス、設計上の考慮事項、およびパッケージ化について説明しています。トランスポートSDKのインタフェースは、転送プロトコルとOracle Service Busランタイムの間の橋渡しを行います。


ヒント:

この章を開始する前に、第38章「設計上の考慮事項」を確認してください。

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

40.1 はじめに

Oracle Service Busトランスポートは、元々はOracle Service Busサーバーにデプロイするように設計され、Oracle Service Busコンソールを使用して構成されています。Eclipseなどの設計環境で使用する場合、SDKと既存のトランスポートを多少変更する必要があります。

このドキュメントでは、Oracle Service Busトランスポート・デザイン・タイムをOracle Service Busコンソール以外のプラットフォームで使用できるようにするための追加の手順について説明します。

サンプル・ソケット・トランスポートは、Eclipseに移植されており、Eclipse統合のベスト・プラクティスとみなすことができます。サンプル・ソケットのリソースは、OSB_ORACLE_HOME/samples/servicebus/sample-transport/にあります。Javaソース・ファイルは/srcサブディレクトリにあります。サンプルにはビルド・スクリプトも含まれており、Eclipse統合とOracle Service Busコンソール・デプロイメント両方のためにサンプル・ソケット・トランスポートを自動的にパッケージ化できます。サンプル・ソケット・トランスポートのビルドおよびデプロイについては、第42章「サンプル・ソケット・トランスポート・プロバイダ」を参照してください。

40.2 サービスのランタイムとサービスの構成

トランスポートを開発する場合は、ランタイム・アスペクトと構成アスペクトを区別する必要があります。ランタイム・アスペクトには、プロキシ・サービスまたはビジネス・サービスのデプロイメントおよびサービスの実行時の呼出しが含まれます。構成アスペクトには、プロキシまたはサービスの構成と検証が含まれます。

ランタイム・アスペクトは、Oracle Service Busサーバーが実行されている状況で常に実行されるため、変更する必要はありません。ただし、構成アスペクトは、設計環境に依存します。

開発者は、以下の3種類のモードを考慮する必要があります。

  1. オンライン・モード–カスタム・トランスポートのサービスが、実行中のOracle Service BusサーバーでOracle Service Busコンソールによって構成されます。

  2. オフライン・モード - トランスポートが、Oracle Service Busサーバーの外部で実行されている設計環境を使用して構成されます。リモート・サーバーは使用できません。

  3. オフライン・モード(リモート・サーバーあり) - トランスポートが、Oracle Service Busサーバーの外部で実行されている設計環境を使用して構成されます。ただし、リモート・サーバーが利用可能であり、検証および構成の両方の目的に使用できます。

Eclipseで実行されるトランスポートは、オフライン・モードと、必要に応じて、オフライン・モード(リモート・サーバーあり)をサポートする必要があります。

ここででは次のトピックについて説明します。

40.2.1 オフライン・メソッド

オフライン・モードでトランスポートをデプロイする場合、構成フレームワークは、すべてのリソースの構成用に1つのセッションを作成します。このセッションがアクティブ化されることはありません。プロキシ・サービスまたはビジネス・サービスは、実行中のOracle Service Busサーバーにしかデプロイできないため、セッションをアクティブ化する必要はありません。ただし、やはり競合および構成エラーの検出は重要であるため、検証メソッドは引続き実行されます。

以下は、オフライン・モードで実装する必要がある、トランスポートSDKによって定義されているクラスおよびメソッドの最小セットのリストです。読みやすくするために、例外はメソッド・シグネチャから削除されています。


注意:

オフライン・モード用にトランスポートを完全に再実装する必要はありません。ほとんどの場合、トランスポートは、既存のメソッドにいくつかの変更を加えるだけで、オンライン・モードとオフライン・モードの両方をサポートできます。

オフライン・メソッドのために実装する必要があるクラスとメソッド

  • public interface TransportProviderクラス

String getId();
void validateEndPointConfiguration(TransportValidationContext context);
SchemaType getEndPointConfigurationSchemaType();
SchemaType getRequestMetaDataSchemaType();
SchemaType getRequestHeadersSchemaType();
SchemaType getResponseMetaDataSchemaType();
SchemaType getResponseHeadersSchemaType();
TransportProviderConfiguration getProviderConfiguration();
TransportUIBinding getUIBinding(TransportUIContext context);
void shutdown();
Collection<NonQualifiedEnvValue> getEnvValues(Ref ref, EndPointConfiguration epConfig);
void setEnvValues(Ref ref, EndPointConfiguration epConfig, Collection<NonQualifiedEnvValue> envValues);
Collection<Ref> getExternalReferences(EndPointConfiguration epConfig);
void setExternalReferences(Map<Ref, Ref> mapRefs, EndPointConfiguration epConfig);
Map<String, String> getBusinessServicePropertiesForProxy(Ref ref);
XmlObject getProviderSpecificConfiguration(Ref ref, Map<String, String> props);
  • public interface TransportProviderFactoryクラス

    このインタフェースは、トランスポートをオフライン・モードで登録します。詳細は、43章「トランスポート・プロバイダのデプロイ」を参照してください。

  • public interface TransportUIBindingクラス

    このインタフェースですべてのメソッドを実装して、プロキシ・サービスまたはビジネス・サービスの構成に使用されるユーザー・インタフェースを定義する必要があります。

ヘルパー・クラス

  • public class TransportManagerHelperクラス

    このクラスは、通常はTransportProviderの開発者によって使用されます。プロバイダを実装する際にコードがオフラインで実行しているかどうかを判別するためのboolean isOffline()メソッドを提供します。

    オフライン・モードで無効な一部のメソッドは次のように例外をスローします。他のメソッドは、public isAdmin()のようにランタイムまたはデプロイメントのみに対応します。

    オフライン・モード(リモート・サーバーあり)で作業するときは次のメソッドも使用できます。

    オフライン・モードでは、次の2つのメソッドは呼び出さないでください。

    • isAdmin()メソッドは例外をスローします(public static boolean isAdmin();)。このメソッドは、java.lang.IllegalStateExceptionメッセージをスローします。

    • clusterExists()メソッドは、常にfalseを返します(public static boolean clusterExists();)。このメソッドは、常にfalseを返します。


    注意:

    ランタイムのステータスをチェックするための推奨メソッドは、isRuntimeEnabled()getRuntimeServers()の組合せです。

40.2.2 オフラインで作業する場合の制限

オフラインで作業する場合、サーバー上で実行されているOracle WebLogic Serverサービスは使用できません。40.2.1項「オフライン・メソッド」で説明されているメソッド内でこれらのサービスを使用しないでください。

以下は、オフラインで作業する場合の制限の例です。

  • WLS MBeanは使用できません。

  • サーバーJavaプロパティは使用できません。

  • JNDIツリーに直接アクセスすることはできません。ただし、JNDIプロパティがサービス構成で定義されている場合は、それらの使用を試みることができます。

  • サービスがクラスタまたはスタンドアロン・サーバーのどちらで実行されるのかを判断することはできません。

  • Oracle WebLogic Serverセキュリティ・インフラストラクチャにアクセスすることはできません。

  • サーバーにある静的なシングルトン・サービスにアクセスすることはできません。

一部のサービスが使用できないため、トランスポートのユーザー・インタフェースがどのように影響を受けるかを評価する必要があります。一般的に、ユーザー・インタフェースは、ユーザーが値をサーバー環境から取得しようとするかわりに、値を手動で構成できるだけの柔軟性を備えている必要があります。

Eclipseデザイン・タイムでは、現時点では、Oracle Service Busクラスタ環境へのデプロイメントはサポートされていません。そのため、クラスタがないものとしてユーザー・インタフェースを設定する必要があります。必要に応じて、ユーザーは、カスタム・ファイルを使用して構成を更新し、Oracle Service Busクラスタへのデプロイメントを強制することができます。

たとえば、一部のトランスポートでは、TransportManagerHelperを使用し、ユーザーがリストから選択できるようにして、使用可能なWorkManager項目のリストを取得します。ただし、オフライン・モードではMBeanが使用できないため、リストを設定することはできません。トランスポート・プロバイダには次の2つの選択肢があります。

  1. ユーザーが正確なWorkManager名を入力できるようにします。この場合、オフラインで作業する際は、ユーザー・インタフェースを、リストではなくテキスト・ボックスに変更する必要があります。

  2. より柔軟性の低いもう1つの選択肢は、デフォルトのWorkManagerだけを使用してリストを設定する方法です。サービスが実行中のOracle Service Busサーバーにプッシュされるときに、環境値の代入を使用してWorkManager名を切り替えることができます。

40.2.3 オフライン(リモート・サーバーあり)での作業

オフラインで作業する場合に、リモート・サーバーを使用できる場合があります。たとえば、Eclipseでサービスを構成するときに、ユーザーが、リモートのOracle Service Busサーバーを現在のプロジェクトに関連付けることができます。トランスポート・プロバイダは、Oracle WebLogic Server MBeanにアクセスして情報を取得することで、リモート・サーバーを利用することができます。このモードは、オンラインでの作業に似ていますが、コードがサーバーで実行されず、MBeanしか使用できないため、やはりいくつかの制限が適用されます。

オフラインで作業する場合、以下の説明が適用されます。

  • サーバーJavaプロパティは使用できません。

  • 40.2.1項「オフライン・メソッド」で説明されているように、多くのTransportManagerHelperメソッドは使用できません。

  • JNDIツリーに直接アクセスすることはできません。ただし、JNDIプロパティがサービス構成で定義されている場合は、それらの使用を試みることができます。

  • サーバーにある静的なシングルトン・サービスにアクセスすることはできません。

MBeanにアクセスするために、フレームワークは、TransportUIオブジェクトをリクエストするとき、または、プロバイダに構成を検証するようにリクエストするときに、JMXConnectorのインスタンスを提供します。JMXConnectorはTransportUIContextまたはTransportValidationContextで使用できます。

JMXConnector connector = (JMXConnector)uiContext.get(TransportValidationContext.JMXCONNECTOR);

詳細は、40.4項「リファレンス」のサンプル・トランスポートを参照してください。

コネクタが存在しない場合、リモート・サーバーは使用できません。このコネクタ・オブジェクトはその後MBeanへのアクセスに使用できます。ヘルパー・メソッドがTransportManagerHelperに追加されたため、WorkManagerおよびOracle WebLogic ServerドメインMBeanのリストを取得できます。


注意:

この動作は、オンライン・モードおよびオフライン・モード用に汎用化されています。TransactionManagerHelperで定義されているpublic static Set<String> getDispatchPolicies()メソッドは非推奨となるため、JMXConnectorをパラメータとして持つ同じメソッドで置き換える必要があります。置換えない場合、com.bea.wli.sb.transports.TransportExceptionエラーが表示されます。

40.2.4 オフライン・モードでのトランスポートのブートストラップ

オンライン・モードでは、トランスポートをEARファイルとしてパッケージ化し、Oracle Service Busサーバーにデプロイする必要があります。起動時にEARがロードされると、トランスポートは、起動イベントでコールバックを登録し、TransportProviderのインスタンスをTransportManagerに登録します。

オフライン・モードでは、トランスポートを登録するcom.bea.wli.sb.transports.TransportProviderFactoryというインタフェースがSDKで提供されます。トランスポートの開発者は、このインタフェースを実装し、デフォルトのコンストラクタをパブリックにする必要があります。このインタフェースは、40.4項「リファレンス」でサンプル実装と共に提供されています。

TransportProvideFactoryがインスタンス化された場合、トランスポートを(リモート・サーバーの有無にかかわらず)オフライン・モードで動作させる必要があると想定できます。


注意:

トランスポートがオフライン・モードで実行されているかどうかを判断するためにコンストラクタが呼び出されるときに、TransportManagerHelperでブール演算子を設定できます。この情報は、TransportUIContextおよびTransportValidationContextにも渡すことができます。この決定に際しては、技術部門に支援を受けることができます。

40.2.5 オフライン・モードでのトランスポートのパッケージ化

オフライン・モードでは、異なる設計環境でトランスポートを使用することができます。Eclipse環境は特定のパッケージ化を定義しています。これについては、次の項で説明します。一般的に、トランスポートは、独立したJARファイルとして、外部の設計時環境から使用できる必要があります。独立したJARファイルでは、トランスポートのconfig.xmlファイル、ヘッダー、メタデータ、スキーマ、XBeanクラス、TransportManagerHelper実装、およびコンパイル済のトランスポート・クラスがJARファイルに含まれます。

40.3 Eclipseプラグインとしてのトランスポートのパッケージ化

Eclipseプラグインとしてカスタム・トランスポートをパッケージ化し、同時にトランスポートのユーザー・インタフェースを実装することで、サービスの開発者が、開発環境でそのトランスポートを選択および構成できるようになります。

図40-1は、選択したトランスポートの構成ページが含まれる(サービス作成後の)サービス・エディタを示しています。

図40-1 Eclipseのトランスポート構成ページ

図40-1の説明が続きます
「図40-1 Eclipseのトランスポート構成ページ」の説明


注意:

TransportUIBindingインタフェースの実装によって、EclipseとOracle Service Busコンソールでの、トランスポートを選択および構成するためのユーザー・インタフェースが決まります。

Oracle Service Busは、Eclipse用のEclipseベースのプラグインを提供しています。Oracle Service Busのコア・プラグインであるcom.bea.alsb.coreは、Eclipse環境で、Oracle Service Busトランスポートをプラグインとして登録するために使用される拡張ポイント(com.bea.alsb.core.transports)を定義しています。

40.3.1 トランスポート・プラグインのリソース

トランスポート・プラグインは、以下のリソースを提供する必要があります。

  • MANIFEST.MFファイル – トランスポート・プラグインに関する重要な情報が含まれます。参考として、サンプル・ソケット・トランスポートのMANIFEST.MFを使用してください。40.4.5項「MANIFEST.MF」を参照してください。

  • plugin.xmlファイルで、トランスポートをプラグインとしてEclipseに登録する拡張ポイントを提供します。参考として、サンプル・ソケット・トランスポートのプラグインを使用してください。40.4.4項「plugin.xml」を参照してください。

  • トランスポートの実装を含むトランスポートJARファイル。

  • (オプション)オンライン・ヘルプを提供するためのリソース。

40.3.2 トランスポート・プラグインのパッケージ化

トランスポート・プラグインをJARファイルとして、または展開ディレクトリにパッケージ化できます。JARとしてパッケージ化すると、トランスポートの移動がより容易になります。展開ディレクトリとしてパッケージ化すると、その他のOracle Service Busプラグインのリソースを参照できるようになります。たとえば、トランスポートのヘルプをEclipseヘルプ・システムのOracle Service Busトランスポートのトピックとマージする場合、39.12.2項「Eclipseでのカスタム・トランスポートのヘルプの提供」の説明に従って、トランスポート・プラグインを展開ディレクトリにパッケージ化する必要があります。

プラグインをJARまたは展開ディレクトリのどちらにパッケージ化するかにかかわらず、トランスポートの実装をJARファイルにパッケージ化する必要があります。

トランスポートをプラグインとしてパッケージ化するには、以下のガイドラインに従います。

  • プラグインJARまたは展開ディレクトリの名前を作成する場合は、MANIFEST.MFファイルからBundle-VersionBundle-SymbolicNameに付加します。たとえば、サンプル・ソケット・トランスポートのJARは、Socket_Transport_3.0.0.0.jarという名前が付けられています。

  • 図40-2に示されているように、次のディレクトリ構造でパッケージ化します。

図40-2 プラグインのパッケージ化

図40-2の説明が続きます
「図40-2 プラグインのパッケージ化」の説明

トランスポート・プラグインのパッケージ化の詳細は、第42章「サンプル・ソケット・トランスポート・プロバイダ」を参照してください。サンプル・ソケット・トランスポートをビルドし、生成されるSocket_Transport_3.0.0.0.jarを確認します。

40.4 リファレンス

ここででは次のトピックについて説明します。

40.4.1 異なるモードでの動作

ほとんどのトランスポートでディスパッチ・ポリシーが使用されており、これによりサービスの抑制が可能になります。このコードは、40.2項「サービスのランタイムとサービスの構成」で説明されている、次の3つのモードを区別します。

  • オンライン・モード

  • オフライン・モード

  • オフライン・モード(リモート・サーバーあり)

例40-1に示すように、リモート・サーバーへの接続はコンテキストから取得されます。

例40-1 リモート・サーバーへの接続

/**
  * Builds the dispatch policies in the ui object.
  *
  * @param curDispatchPolicy
  * @return TransportEditField containing existing dispatch policies.
  */
      public TransportEditField getDispatchPolicyEditField(StringcurDispatch 
          Policy) {
          TransportUIFactory.TransportUIObject uiObject = null;
          Set<String> wmSet = null;
          
          if (SocketTransportManagerHelper.isOffline()) { // if on
               Eclipse try to get the MBeans from the UIContext
                    JMXConnector connector = (JMXConnector)uiContext.get
                         (TransportValidationContext.JMXCONNECTOR);
               if (connector != null) {
                    try {
                         wmSet = TransportManagerHelper.getDispatchPolicies
                              (connector);
                    } catch (Exception ex) {
                         wmSet = null; //continue
                    }
               }
          } else { // if running on the server use the helper to get the
               policies
               try {
                    wmSet = TransportManagerHelper.getDispatchPolicies();
               } catch (TransportException e) {
                    SocketTransportUtil.logger
                         .error(SocketTransportMessagesLogger.
                              noDispatchPolicies(), e);
               }
          }

          if (wmSet == null) // if JMXConnector not available or impossible
               to connect provide a simple edit field
          {
               uiObject = TransportUIFactory.createTextBox
                    (curDispatchPolicy);
          } else // create a drop down list
          {
               // adding default work manager to the list.
               wmSet.add(DEFAULT_WORK_MANAGER);
               String[] values = wmSet.toArray(new String[wmSet.size()]);
               uiObject = TransportUIFactory.createSelectObject(
                    values,
                    values,
                    curDispatchPolicy,
                    TransportUIFactory.SelectObject.DISPLAY_LIST,
                         false);
          }
          return TransportUIFactory.createEditField(DISPATCH_POLICY,
               TextMessages.getMessage(TextMessages.DISPATCH_POLICY,
                    locale),
               TextMessages.getMessage(TextMessages.DISPATCH_POLICY_INFO,
                    locale), uiObject);
     }

40.4.2 TransportProviderFactory

TransportProviderFactory(例40-2)を使用して、Eclipseに開発時の機能を提供できます。

例40-2 TransportProviderFactoryクラス

package com.bea.wli.sb.transports;

import com.bea.wli.sb.transports.TransportException;
import com.bea.wli.sb.transports.TransportManager;

/**
 * This interface is the extension point to plug custom ALSB transports in
   Eclipse.
 * The implementation must declare the default class constructor.
 */
public interface TransportProviderFactory {

     /**
       * Registers a new provider with the transport manager. Typically
       * called by the ALSB core eclipse plugin.
       * @param tm the transport manager to which to register
       */
       public void registerProvider(TransportManager tm) throws
            TransportException;
     /**
        * @return a unique string that identifies this provider, like "http"
       * This method must return the same ID than provider.getId()
       */
     String getId();
}

例40-3のコード・サンプルは、ソケット・トランスポートがこのインタフェースをどのように実装するかを示しています。

例40-3 インタフェースを実装するソケット・トランスポートの例

package com.bea.alsb.transports.sock;

import com.bea.wli.sb.transports.TransportManager;
import com.bea.wli.sb.transports.TransportException;
import com.bea.wli.sb.transports.TransportProviderFactory;
public class SocketTransportProviderFactory implements
     TransportProviderFactory {

     public static boolean isOffline() {
          return isOffline;
     }

     private static boolean isOffline = false;

     public void registerProvider(TransportManager tm) throws
          TransportException {
          isOffline = true;
          SocketTransportProvider instance =
               SocketTransportProvider.getInstance();
          tm.registerProvider(instance, null);
     }

     public String getId() {
          return SocketTransportProvider.ID;
     }
}

40.4.3 拡張ポイント・スキーマ

例40-4は、40.4.4項「plugin.xml」で示されているように、トランスポートをEclipseプラグインとして追加するためのtransport要素およびtransport-provider属性を定義している拡張ポイント・スキーマからの抜粋です。

例40-4 拡張ポイント・スキーマの一部

<element name="transport">
     <complexType>
          <attribute name="transport-provider" type="string" use="required">
               <annotation>
                    <documentation>
                    </documentation>
                    <appInfo>
                         <meta.attribute kind="java" basedOn="
                              com.bea.wli.sb.transports.Transport
                              ProviderFactory"/>
                    </appInfo>
               </annotation>
          </attribute>
     </complexType>
</element>

40.4.4 plugin.xml

例40-5は、サンプル・ソケット・トランスポートのplugin.xmlファイルでのトランスポートの拡張を示しています。このファイルは、OSB_ORACLE_HOME/samples/servicebus/sample-transport/eclipse/にあります。

例40-5 Plugin.xmlファイル

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
     <extension
          id="socket"
          name="Socket Transport"
          point="com.bea.alsb.core.transports">
          <transport transport-provider="com.bea.alsb.transports
               .sock.SocketTransportProviderFactory"/>
     </extension>
</plugin>

plugin.xmlの重要な部分

  • extension point属性の値は、トランスポートでは常にcom.bea.alsb.core.transportsです。

  • transport-provider属性は、TransportProviderFactory実装クラスの完全修飾パスです。


    注意:

    通常、Eclipse内のライフ・サイクル管理にトランスポート・プロバイダは必要ないため、標準のプラグインのようにorg.eclipse.core.runtime.Pluginクラスを拡張する必要はありません。

Eclipseでカスタム・トランスポートのヘルプを提供する場合、plugin.xmlにもヘルプ・エントリを持つことになります。詳細は、39.12項「カスタム・トランスポートのヘルプの作成」を参照してください。

40.4.5 MANIFEST.MF

例40-6はサンプル・ソケット・トランスポートのMANIFEST.MFファイルを示しています。このファイルは、OSB_ORACLE_HOME/samples/servicebus/sample-transport/eclipse/META-INF/にあります。

例40-6 MANIFEST.MFファイルのサンプル

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Socket Transport Plug-in
Bundle-SymbolicName: Socket_Transport;singleton:=true
Bundle-Version: 3.0.0.0
Bundle-Localization: plugin
Bundle-ClassPath: .,
     lib/sock_transport.jar
Require-Bundle: com.bea.alsb.core

40.4.6 build.xml

トランスポートのコンパイルとパッケージ化のためのビルド・ファイルのサンプルは、ソケット・サンプルのビルド・ファイルOSB_ORACLE_HOME/samples/servicebus/sample-transport/build.xmlを参照してください。

サンプル・ソケット・トランスポートのビルドの詳細は、第42章「サンプル・ソケット・トランスポート・プロバイダ」を参照してください。

40.4.7 TransportManagerHelperメソッド

例40-7に、TransportManagerHelperメソッドを示します。

例40-7 TransportManagerHelperメソッド

public static Set<String> getDispatchPolicies(JMXConnector connector)
     throws TransportException;

     public static DomainRuntimeServiceMBean
     getDomainRuntimeService(JMXConnector connector)
          throws TransportException;