この章では、Oracle Service Bus IDEで使用するカスタム・トランスポートを開発するためのベスト・プラクティス、設計上の考慮事項、およびパッケージ化について説明します。トランスポートSDKのインタフェースは、転送プロトコルとOracle Service Busランタイムの間の橋渡しを行います。
この章の内容は次のとおりです。
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章「サンプル・ソケット・トランスポート・プロバイダ」を参照してください。
トランスポートを開発する場合は、ランタイム・アスペクトと構成アスペクトを区別する必要があります。ランタイム・アスペクトには、プロキシ・サービスまたはビジネス・サービスのデプロイメントおよびサービスの実行時の呼出しが含まれます。構成アスペクトには、プロキシまたはサービスの構成と検証が含まれます。
ランタイム・アスペクトは、Oracle Service Busサーバーが実行されている状況で常に実行されるため、変更する必要はありません。ただし、構成アスペクトは、設計環境に依存します。
開発者は、次の3種類のモードを考慮する必要があります。
オンライン・モード - カスタム・トランスポートのサービスが、実行中のOracle Service BusサーバーのOracle Service Bus管理コンソールを使用して構成されます。
オフライン・モード - トランスポートが、Oracle Service Busサーバーの外部で実行されている設計環境を使用して構成されます。リモート・サーバーは使用できません。
オフライン・モード(リモート・サーバーあり) - トランスポートが、Oracle Service Busサーバーの外部で実行されている設計環境を使用して構成されます。ただし、リモート・サーバーが利用可能であり、検証および構成の両方の目的に使用できます。
Eclipseで実行されるトランスポートは、オフライン・モードと、必要に応じて、オフライン・モード(リモート・サーバーあり)をサポートする必要があります。
この項の内容は次のとおりです。
オフライン・モードでトランスポートをデプロイする場合、構成フレームワークは、すべてのリソースの構成用に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()
のようにランタイムまたはデプロイメントのみに対応します。
オフライン・モード(リモート・サーバーあり)で作業するときは次のメソッドも使用できます。
public Set<String> getDispatchPolicies(JMXConnector connector);
メソッド
public DomainRuntimeServiceMBean getDomainRuntimeServiceMBean(JMXConnector connector);
メソッド
詳細は、40.2.3項「オフライン(リモート・サーバーあり)での作業」を参照してください。
オフライン・モードでは、次のメソッドは呼び出さないでください。
isAdmin()
メソッドは例外をスローします(public static boolean isAdmin();
)。このメソッドは、java.lang.IllegalStateException
メッセージをスローします。
clusterExists()
メソッドは、常にfalseを返します(public static boolean clusterExists();
)。このメソッドは、常にfalseを返します。
注意: ランタイムのステータスをチェックするための推奨メソッドは、 |
オフラインで作業する場合、サーバー上で実行されている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つの選択肢があります。
ユーザーが正確なWorkManager名を入力できるようにします。この場合、オフラインで作業する際は、ユーザー・インタフェースを、リストではなくテキスト・ボックスに変更する必要があります。
より柔軟性の低いもう1つの選択肢は、デフォルトのWorkManagerだけを使用してリストを設定する方法です。サービスが実行中のOracle Service Busサーバーにプッシュされるときに、環境値の代入を使用してWorkManager名を切り替えることができます。
オフラインで作業する場合に、リモート・サーバーを使用できる場合があります。たとえば、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で定義されている |
オンライン・モードでは、トランスポートをEARファイルとしてパッケージ化し、Oracle Service Busサーバーにデプロイする必要があります。起動時にEARがロードされると、トランスポートは、起動イベントでコールバックを登録し、TransportProviderのインスタンスをTransportManagerに登録します。
オフライン・モードでは、トランスポートを登録するcom.bea.wli.sb.transports.TransportProviderFactory
というインタフェースがSDKで提供されます。トランスポートの開発者は、このインタフェースを実装し、デフォルトのコンストラクタをパブリックにする必要があります。このインタフェースは、40.4項「リファレンス」でサンプル実装と共に提供されています。
TransportProvideFactoryがインスタンス化された場合、トランスポートを(リモート・サーバーの有無にかかわらず)オフライン・モードで動作させる必要があると想定できます。
注意: トランスポートがオフライン・モードで実行されているかどうかを判断するためにコンストラクタが呼び出されるときに、TransportManagerHelperでブール演算子を設定できます。この情報は、TransportUIContextおよびTransportValidationContextにも渡すことができます。この決定に際しては、技術部門に支援を受けることができます。 |
オフライン・モードでは、異なる設計環境でトランスポートを使用することができます。Eclipse環境は特定のパッケージ化を定義しています。これについては、次の項で説明します。一般的に、転送は、独立したJARファイルとして、外部の設計時環境から使用できる必要があります。独立したJARファイルでは、トランスポートのconfig.xmlファイル、ヘッダー、メタデータ・スキーマ、XBeanクラス、TransportManagerHelper実装、およびコンパイル済のトランスポート・クラスがJARファイルに含まれます。
Eclipseプラグインとしてカスタム・トランスポートをパッケージ化し、同時にトランスポートのユーザー・インタフェースを実装することで、サービスの開発者が、開発環境でそのトランスポートを選択および構成できるようになります。
図40-1は、選択したトランスポートの構成ページが含まれる(サービス作成後の)サービス・エディタを示しています。
注意: 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)を定義しています。
トランスポート・プラグインは、次のリソースを提供する必要があります。
MANIFEST.MFファイル - トランスポート・プラグインに関する重要な情報が含まれます。参考として、サンプル・ソケット・トランスポートのMANIFEST.MFを使用してください。40.4.5項「MANIFEST.MF」を参照してください。
plugin.xmlファイルで、トランスポートをプラグインとしてEclipseに登録する拡張ポイントを提供します。参考として、サンプル・ソケット・トランスポートのプラグインを使用してください。40.4.4項「plugin.xml」を参照してください。
トランスポートの実装を含むトランスポートJARファイル。
(オプション)オンライン・ヘルプを提供するためのリソース。
トランスポート・プラグインをJARファイルとして、または展開ディレクトリにパッケージ化できます。JARとしてパッケージ化すると、トランスポートの移動がより容易になります。展開ディレクトリとしてパッケージ化すると、その他のOracle Service Busプラグインのリソースを参照できるようになります。たとえば、トランスポートのヘルプをEclipseヘルプ・システムのOracle Service Busトランスポートのトピックとマージする場合、39.12.2項「Eclipseでのカスタム・トランスポートのヘルプの提供」の説明に従って、トランスポート・プラグインを展開ディレクトリにパッケージ化する必要があります。
プラグインをJARまたは展開ディレクトリのどちらにパッケージ化するかにかかわらず、トランスポートの実装をJARファイルにパッケージ化する必要があります。
トランスポートをプラグインとしてパッケージ化するには、次のガイドラインに従います。
プラグインJARまたは展開ディレクトリの名前を作成する場合は、MANIFEST.MFファイルからBundle-Version
をBundle-SymbolicName
に付加します。たとえば、サンプル・ソケット・トランスポートのJARは、Socket_Transport_3.0.0.0.jarという名前が付けられています。
図40-2に示されているように、次のディレクトリ構造でパッケージ化します。
plugin.xml (プラグインのルート)
/lib/your_transport.jar (トランスポート・クラスおよびリソース)
/META-INF/Manifest.mf
/help - トランスポートのヘルプを提供する場合、39.12.2項「Eclipseでのカスタム・トランスポートのヘルプの提供」の説明に従って、ヘルプ・リソースの/helpディレクトリを含めてください。
トランスポート・プラグインのパッケージ化の詳細は、第42章「サンプル・ソケット・トランスポート・プロバイダ」を参照してください。サンプル・ソケット・トランスポートをビルドし、生成されるSocket_Transport_3.0.0.0.jarを確認します。
この項の内容は次のとおりです。
ほとんどのトランスポートでディスパッチ・ポリシーが使用されており、これによりサービスの抑制が可能になります。このコードは、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); }
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は、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-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-6はサンプル・ソケット・トランスポートのMANIFEST.MFファイルを示しています。このファイルは、OSB_ORACLE_HOME/samples/servicebus/sample-transport/eclipse/META-INF/にあります。
トランスポートのコンパイルとパッケージ化のためのビルド・ファイルのサンプルは、ソケット・サンプルのビルド・ファイルOSB_ORACLE_HOME/samples/servicebus/sample-transport/build.xmlを参照してください。
サンプル・ソケット・トランスポートのビルドの詳細は、第42章「サンプル・ソケット・トランスポート・プロバイダ」を参照してください。
例40-7に、TransportManagerHelperメソッドを示します。