通常、シン・クライアント・アプリケーションは、ジョブの発行、ステータスの問合せに使用され、オプションでEJBジョブ実装のホストに使用されます。シン・クライアント・アプリケーションでは、Oracle Enterprise Scheduler APIにOracle Enterprise Schedulerシン・クライアント・ライブラリが使用されます。この章では、シン・クライアント・ライブラリおよびOracle JDeveloperを使用したシン・クライアント・アプリケーションの開発方法について説明します。
この章の構成は、次のとおりです。
クライアント・アプリケーションは、Oracle Enterprise Schedulerと同じWebLogicドメインで実行されるJ2EEアプリケーションです。
クライアント・アプリケーションは、Oracle Enterprise Scheduler APIを使用して次の処理を実行できます。
ジョブの発行
ジョブ・ステータスの問合せ
ジョブ出力およびログの参照
オプションで、Oracle Enterprise Schedulerメタデータの更新の実行
Oracle Enterprise Schedulerがリモートで起動するEJBジョブ実装のホスト
Oracle Enterprise Schedulerシン・クライアント・ライブラリは、Oracle Enterprise Scheduler API(メタデータ・サービスAPIまたはランタイム・サービスAPIなど)にアクセスするためにクライアント・アプリケーションによって使用されます。シン・クライアント・ライブラリは、リモートでOracle Enterprise Schedulerホスティング・アプリケーションを起動し、すべての操作を実行するシン・レイヤーです。オプションで、シン・クライアント・アプリケーションには、Oracle JDeveloperを使用して開発されたOracle Enterprise Schedulerメタデータを含むOracle Enterprise SchedulerメタデータMARアーカイブが含まれる場合があります。このメタデータは、アプリケーションのデプロイ時、Oracle Enterprise Scheduler MDSに自動的にロードされます。または、アプリケーションは、APIを使用してメタデータを動的に作成できます。
シン・クライアント共有ライブラリは、クライアント共有ライブラリと次の点で異なります。
クライアント共有ライブラリには、MDSおよびランタイム・データベースに直接アクセスすることで、すべてのOracle Enterprise Schedulerの作業を実行するローカルEJBが含まれます。シン・クライアント・ライブラリには、データ・ソースおよびEJBは含まれませんが、EJBをホストしデータベースにアクセスするホスティング・アプリケーションにリモートでアクセスします。
シン・クライアント・ライブラリは、Oracle Enterprise Schedulerの内部機能をアプリケーションに対してより巧みに非表示にします。
データベースに直接アクセスするため、Oracle Enterprise Schedulerサーバーまたはクラスタが停止している場合でもクライアント共有ライブラリは機能します。
シン・クライアント・ライブラリは、Oracle Enterprise Schedulerのデプロイメントが埋込み製品のオプションの場合も便利です。
クライアント共有ライブラリによって公開されているすべてのドキュメント化済APIは、シン・クライアント・ライブラリで使用可能です。したがって、シン・クライアント・アプリケーションは次の処理を行えます。
ランタイム・サービスAPIを使用したリクエストの発行
ランタイム・サービスAPIを使用したリクエストの操作
メタデータ・サービスAPIを使用したメタデータ・アーティファクトの更新
非同期リクエストのリモートでの完了
シン・クライアント・ライブラリは、リモートでOracle Enterprise Schedulerホスティング・アプリケーションを起動し、すべての操作を実行するため、ローカルBeanではなく、リモートOracle Enterprise Scheduler Beanを参照する必要があります。リモートOracle Enterprise SchedulerサーバーのInitialContextの取得にはオーバーヘッドがあります。RemoteConnector APIは、Oracle Enterprise Scheduler Beanのコールバックに対して次のような支援を提供します。
ヘルパー・クラスは、RemoteConnectorsを使用してOracle Enterprise Scheduler Bean (RuntimeService、MetadataServiceなど)に簡単に接続し返します。
ログおよび出力は、リモート実装から処理できます。
非同期リクエストを簡単に完了できます。
起動およびコールバックを保護できます。
このトピックでは、シン・クライアント・ライブラリを使用してリモートEJBジョブを実装する際に考慮する点をいくつか示します。
シン・クライアント・ライブラリを使用してリモートEJBジョブを実装する際は、次のことを考慮します。
Beanが、実行のみのRemoteExecutableインタフェース、または実行と取消しの両方の操作のRemoteCancellableExecutableインタフェースを実装していることを確認します。
SOA_BEAN_NAMEなどの固有のプロパティを定義するのではなく、EJB_OPERATION_NAMEなどの事前定義済システム・プロパティを使用します。
ejb-jar.xmlファイルは、oracle.security.jps.ee.ejb.JpsInterceptorインターセプタを定義する必要があります。インターセプタを使用して、Oracle Enterprise Schedulerレイヤーから伝播されたサブジェクトを取得し、他の操作で使用します。
ジョブ・ロジックが変更されたときにEJBが再デプロイされないようにするために、ジョブ実装をejb-jar.xmlファイルから移動させておくことが最善の方法です。
ヒント:
JNDIコンテキストが渡された値で作成できない場合、アプリケーションはjavax.naming.NamingException例外をスローします。または、資格証明キーストアを含む参照で問題が発生した場合、ScehdulerException例外がスローされる場合もあります。
リモートEJBの保護された起動は、そのサーバーのJNDIツリーが認証されている場合に必須です。これは、リモートEJBが保護された参照を使用してOracle Enterprise Scheduler EJBをコールバックする場合も同様です。次の各項で、ガイドラインを示します。
次の内容が転送起動に適用されます。
Oracle Enterprise SchedulerがリモートEJBを起動する場合、実行ジョブのサブジェクトは常に伝播されます。
Oracle Enterprise Schedulerがジョブを実行する際、現在のOracle Enterprise Scheduler ServerのJndiProviderUrlはRequestParametersを介してリモートEJBに常に提供されます。
リモート・サーバーのJNDIツリーが認証されている場合、JNDI_CSF_KEYプロパティをリクエスト・パラメータまたはホスティング・アプリケーションのEssConfigurationで指定する必要があります。
Oracle Enterprise Schedulerは、CsfKeyのキーストアを参照してPasswordCredentialを取得し、リモート・サーバーに接続します。
次の内容がコールバック起動に適用されます。
リモートEJBがOracle Enterprise SchedulerのBeanにコールバックする必要がある場合、次のプロパティを指定できます。
HostingAppで公開されているOracle Enterprise SchedulerのRuntime、MetadataおよびAsyncRequest BeanのJNDI名は、リクエスト・パラメータまたはホスティング・アプリケーションのEssConfigurationで指定する必要があります。EssNativeHostingAppが使用されている場合、これらのエントリは必要がありません。
Oracle Enterprise SchedulerサーバーのJNDIツリーが認証されている場合、ESS_JNDI_CSF_KEY_NAMEプロパティをリクエスト・パラメータまたはホスティング・アプリケーションのEssConfigurationで指定する必要があります。Oracle Enterprise Schedulerにより、このプロパティがRequestParametersを介してリモートEJBで使用可能になります。
リモートEJBは、RemoteConnector APIを使用して、 Oracle Enterprise Scheduler Beanのリモート・インスタンスを取得できます。これは、次を渡すことで実行できます。
RequestParameters
BeanのRequestParametersおよびJndiMappedName (ネイティブ・ホスティング・アプリケーション以外のホスティング・アプリケーション用)
RequestParameters、ユーザー名およびパスワード(Oracle Enterprise Schedulerサーバーが認証されている場合)
InitialContext (主にEssNativeHostingAppを伴うJava SEクライアント用)
InitialContextおよびjndiMappedName (主にその他のホスティング・アプリケーションを伴うJava SEクライアント用)
コードの実装がOracle Enterprise Scheduler EJBへのアクセスに依存している場合、RemoteConnector APIクラスで公開されているメソッドを使用します。Oracle Enterprise Schedulerでは、JNDIルックアップを実行する前にサーバー・アフィニティ・プロパティをInitialContext環境で設定する必要があり、RemoteConnector APIクラスがこのプロパティを設定します。これは、マルチノード・クラスタ・シナリオで特に重要です。RemoteConnectorクラスは、Oracle Enterprise Schedulerクライアント・ライブラリでパッケージ化されています。
何らかの理由でRemoteConectorクラスを使用できない場合、次の例に示すように、Oracle Enterprise Scheduler EJBの参照を実行する前に環境マップ・プロパティをInitialContextに設定できます。
if(PlatformUtils.isWebLogic())
envProps.put("weblogic.jndi.enableServerAffinity", "true");
マルチノード・クラスタ環境では、クラスタ・アルゴリズムをラウンドロビン・アフィニティに設定するのが最適です。
この項では、シン・クライアント・ライブラリの使用方法を表す例を示します。
次のコードの例は、事前デプロイ済のネイティブ・ホスティング・アプリケーションを介してRemoteConnectorを使用するJava EEアプリケーションからのスニペットを示しています。
RemoteConnector essConnector = newRemoteConnector(); //RequestParameters contains the JndiProviderURL of Oracle Enterprise Scheduler //Server which is auto-populated from the Oracle Enterprise Scheduler end while //invoking an EJB. The CSF key is auto-populated in RequestParameters from the //Oracle Enterprise Scheduler end if configured for the //Oracle Enterprise Scheduler Server and specified in the EssConfig of HostingApp. //If CSF key is present, the CSF lookup is done from RemoteConnector to resolve //authentication. RuntimeService rts = essConnector.getRuntimeServiceEJB(requestParameters); //Sample invocation using RuntimeServiceBean. RuntimeServiceHandle handle = rts.open(); RequestDetail reqDetail = rts.getRequestDetail(handle, requestExecutionContext.getRequestId());
次の例は、シン・クライアント・ライブラリを使用するEJBジョブのスケルトン実装を示しています。EJBジョブ実装の詳細は、「EJBジョブの作成と使用」を参照してください。
@Stateless(name = "JMXAdapter")
public class JMXAdapterBean implements RemoteCancellableExecutable
{
@Resource
private SessionContext sctx;
public JMXAdapterBean() {
}
public void execute(RequestExecutionContext requestExecutionContext,
RequestParameters requestParameters) throws
ExecutionErrorException,
ExecutionWarningException,
ExecutionPausedException,
ExecutionCancelledException
{
//"ESS RequestId:" + requestExecutionContext.getRequestId();
//"EJB Operation:" + requestParameters.getValue(SystemProperty.EJB_OPERATION_NAME);
//"Invoke Message:" + requestParameters.getValue(SystemProperty.INVOKE_MESSAGE);
}
public void cancel(RequestExecutionContext requestExecutionContext,
RequestParameters requestParameters)
{
//"ESS RequestId:" + requestExecutionContext.getRequestId();
//"EJB Operation:" + requestParameters.getValue(SystemProperty.EJB_OPERATION_NAME);
//"Invoke Message:" + requestParameters.getValue(SystemProperty.INVOKE_MESSAGE);
}
}
Oracle Enterprise SchedulerがEJBジョブを起動する場合、ホスティング・アプリケーションに関連付けられているサブジェクトはジョブに常に伝播されます。これにより、ジョブを実行するサブジェクトがBeanのビジネス操作で使用可能になります。次のコードをejb-jar.xmlファイルに追加して、Bean内からサブジェクトを取得します。
<interceptors> <interceptor> <interceptor-class>oracle.security.jps.ee.ejb.JpsInterceptor</interceptor-class> <env-entry> <env-entry-name>application.name</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>NAME_OF_ENTERPRISE_APPLICATION</env-entry-value> <injection-target> <injection-target-class>oracle.security.jps.ee.ejb.JpsInterceptor</injection-target-class> <injection-target-name>application_name</injection-target-name> </injection-target> </env-entry> </interceptor> </interceptors> <assembly-descriptor> <interceptor-binding> <ejb-name>*</ejb-name> <interceptor-class>oracle.security.jps.ee.ejb.JpsInterceptor</interceptor-class> </interceptor-binding> </assembly-descriptor>
次のコードを使用すると、現在のサブジェクトの権限のあるコンテキスト内のEJB操作からMBeanを起動できます。
AccessControlContext accContext = AccessController.getContext();
Subject currentSubject = Subject.getSubject(accContext);
String currentUsername = SubjectUtil.getUserName(currentSubject);
Subject.doAs(currentSubject, new PrivilegedExceptionAction() {
public Object run() {
//logic to invoke MBean
}
});
ジョブがOracle Enterprise Schedulerの事前デプロイ済ネイティブ・ホスティング・アプリケーションを使用している場合、メタデータの作成を支援し、事前デプロイ済ネイティブ・ホスティング・アプリケーションMDSパーティション(essUserMetadata)にこれをデプロイするクライアント・アプリケーションをビルドすることでカスタム・ジョブ・メタデータの作成を簡易化できます。
次の手順は、Oracle JDeveloperを使用して、次の処理を実行するシン・クライアント・アプリケーションを作成する方法を示しています。
ジョブ・メタデータの追加
エンタープライズ・アーカイブ(EAR)の作成
EAR内のメタデータ・アーカイブ(MAR)のパッケージ化
事前デプロイ済のネイティブ・ホスティング・アプリケーションへのメタデータのデプロイ
「JDeveloperを使用したEJBおよびそのジョブ定義メタデータの作成および構成」の手順で、事前デプロイ済ネイティブ・ホスティング・アプリケーションに追加されるEJBジョブ定義によって起動できるEJBの作成方法を説明します。
アプリケーションのデプロイ時、ADFインフラストラクチャが使用されメタデータが特定のパーティションにデプロイされます。事前デプロイ済ネイティブ・ホスティング・アプリケーションのMDSパーティションは、essUserMetadataです。
JDeveloperには、スクリーン・リーダー、スクリーン拡大鏡、キーボード移動用の標準のショートカット・キーなどのアクセシビリティ・オプションが用意されています。さらに読みやすくするため、フォントのサイズや色、オブジェクトの色や形など、JDeveloperをカスタマイズすることもできます。JDeveloperでのアクセシビリティについて、およびこれを構成する手順は、『Oracle JDeveloperによるアプリケーションの開発』のOracle JDeveloperのアクセシビリティ情報に関する項を参照してください。
注意:
JDeveloperを開始する前にMW_HOME環境変数を必ず設定してください。例: export MW_HOME=/scratch/prh/12c/jdevこの変数が設定されていない場合、ジョブ・タイプ・ドロップダウン・メニューには移入されません。
次の手順は、JDeveloperを使用してシン・クライアント・アプリケーションを作成およびデプロイする方法を説明しています。
「新規ギャラリ」ダイアログで、カスタム・アプリケーションおよびプロジェクトを作成します(図6-1を参照)。
カスタム・アプリケーションの作成ダイアログで、アプリケーション名およびアプリケーション・パッケージ接頭辞を入力します(図6-2を参照)。
プロジェクト名を入力し、プロジェクト機能に、「ESSジョブ・サポート」、「ESSクライアント・サポート」および「EJB」を追加します(図6-3を参照)。
EJB設定を構成します(図6-4を参照)。
アプリケーションIDの値を構成します(図6-5を参照)
「次へ」をクリックします。
「終了」をクリックして、新しいアプリケーションを作成するステップを完了します。
前のステップで生成されたMANIFEST.MFファイルを編集し、次の行を削除します。
essclientapi-Specification-Version: 12 Extension-List: essruntime, essclientapi Weblogic-Application-Version: 3.0 essclientapi-Extension-Name: oracle.ess.client.api essruntime-Extension-Name: oracle.ess.runtime essruntime-Specification-Version: 12
左側のツリー・パネルでプロジェクト・ノードを右クリックし、プロジェクト・プロパティを選択して、「ライブラリとクラスパス」をクリックします(図6-6を参照)。「クラスパス・エントリ」ペインで「Java EE」および「エンタープライズ・スケジューラ」のみが選択されていることを確認します。
「新規ギャラリ」ダイアログで、「エンタープライズ・スケジューラ・メタデータ」および「ジョブ定義」を選択します(図6-7を参照)。
「ジョブ定義の作成」ダイアログで「ジョブ・タイプ」ドロップダウンから/oracle/as/ess/core/ProcessJobTypeを選択して、単純な生成済ジョブ定義メタデータを追加します(図6-8を参照)。
生成済ジョブ定義メタデータの追加を完了するには、「オーバーライド」チェック・ボックスを選択して「コマンド行」に値を入力します。SYS_effectiveApplicationという名前のシステム・プロパティに値EssNativeHostingAppを指定して追加します。
EJBジョブ定義メタデータを追加します。「JDeveloperを使用したEJBおよびそのジョブ定義メタデータの作成および構成」の手順に従います。
MARプロファイルを構成します。
「アプリケーションのプロパティ」を選択して、「デプロイメント・ノード」をクリックします。
右側のパネルで「MARモジュール」を選択し、「編集」をクリックします。
MARデプロイメント・プロパティの編集ダイアログで「ユーザー・メタデータ」を選択します(図6-10を参照)。
(前に作成済のプロジェクトのパスの下にある)essmetaディレクトリが使用可能であることを確認します。使用不可の場合、essmetaディレクトリに手動で移動してディレクトリを追加します。
適切なメタデータを選択して、MARでパッケージ化します。「ユーザー・メタデータ」の下にある「ディレクトリ」ノードをクリックして、新規追加されたジョブ定義が選択されていることを確認します(図6-11を参照)。
エンタープライズ・アーカイブ(EAR)のデプロイメント・プロファイルを作成します。
「アプリケーションのプロパティ」を選択して、デプロイメント・ノードをクリックします。
右パネルで「新規」をクリックして、「デプロイメント・プロファイルの作成」ダイアログを起動します。「プロファイル・タイプ」ドロップダウンから「EARファイル」を選択します(図6-12を参照)。
EARのアプリケーション・アセンブリを構成します。ダイアログで、次の2つのプロファイルが選択されていることを確認します。
以前に作成したMARプロファイル
EJBプロファイル。このプロファイルは自動的に作成されます。自動的に作成されない場合、ステップ2の最初で前に説明したように、プロジェクトの新規EJB JARデプロイメント・プロファイルを作成します。
EJB-JARデプロイメント・プロファイルを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」の「プロジェクト」パネルで、Applicationプロジェクトを右クリックし、「プロジェクト・プロパティ」をクリックします。
「プロジェクト・プロパティ」ウィンドウのナビゲータで、「デプロイメント」をクリックします。
「デプロイメント・プロファイル」で、ウィンドウに表示されているすべてのプロファイルを削除し、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで、「プロファイル・タイプ」ドロップダウン・リストから「EJB JARファイル」を選択します。
「名前」フィールドに、EJBの名前を入力します。この例では、MySampleThinClientEjbと入力します。
「OK」をクリックします。
左側にある「EJB JARデプロイメント・プロファイルのプロパティの編集」ダイアログ・ナビゲータで、「一般」をクリックします。
「一般」ウィンドウで、「エンタープライズ・アプリケーション名」フィールドにMySampleThinClientAppと入力します。
ナビゲータで、「ファイル・グループ」→「プロジェクトの出力」→「コントリビュータ」の順に開きます。
「コントリビュータ」ウィンドウで、次のチェック・ボックスを選択します。
プロジェクトの出力ディレクトリ
プロジェクトのソースパス
プロジェクトの依存性
ナビゲータで、「ファイル・グループ」→「プロジェクトの出力」→「フィルタ」の順に開きます。
「フィルタ」ウィンドウの「フィルタ」タブで、次のフォルダが選択されていることを確認します。
META-INF(およびそのコンテンツ)
oracle (およびそのコンテンツ)
「JARオプション」ウィンドウで、「Manifestファイルを含める」項目を選択解除します。
「OK」をクリックします。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
EARのライブラリ依存性を構成します。「デプロイ用に選択されたライブラリ」ペインで選択されている項目がないことを確認してください。
adf-config.xmlファイルを構成します。ADFベースのアプリケーションをJDeveloperからデプロイする際、メタデータがデプロイされるMDSパーティションを選択するよう求めるダイアログがあります。このアプリケーションから生成されるEARファイルがWLSコンソールからデプロイされる場合、特定のMDSパーティション・エントリをadf-config.xmlファイルで指定する必要があります。この場合、adf-config.xmlファイルに、例6-1に示されるエントリが含まれていることを確認します。adf-config.xmlファイルは、「アプリケーション・リソース」→「ディスクリプタ」→左パネルの下部の「ADF META-INF」セクションにあります。
weblogic-application.xmlファイルを構成します。weblogic-application.xmlファイルのコンテンツが例6-2に示されているとおりであることを確認します。
アプリケーションをデプロイします。EARのデプロイメントを完了するには、「デプロイメント構成」ダイアログの「パーティション名」ドロップダウンでessUserMetadataを選択し、「デプロイ」をクリックします。
例6-1 adf-config.xmlファイルのコンテンツ
<?xml version="1.0" encoding="UTF-8" ?>
<adf-config xmlns="http://xmlns.oracle.com/adf/config">
<adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config">
<mds-config xmlns="http://xmlns.oracle.com/mds/config" version="11.1.1.000">
<persistence-config>
<metadata-namespaces>
<namespace path="/oracle/apps/ess/custom" metadata-store-usage="ess_custom_metadata"/>
</metadata-namespaces>
<metadata-store-usages>
<metadata-store-usage id="ess_custom_metadata" deploy-target="true" default-cust-store="true">
<ns3:metadata-store class-name="oracle.mds.persistence.stores.db.DBMetadataStore" xmlns:ns3="http://xmlns.oracle.com/mds/config">
<ns3:property name="repository-name" value="mds-ESS_MDS_DS" />
<ns3:property name="partition-name" value="essUserMetadata" />
<ns3:property name="jndi-datasource" value="jdbc/mds-ESS_MDS_DS" />
</ns3:metadata-store>
</metadata-store-usage>
</metadata-store-usages>
</persistence-config>
</mds-config>
</adf-mds-config>
</adf-config>
例6-2 weblogic-application.xmlファイルのコンテンツ
<?xml version = '1.0' encoding = 'UTF-8' ?> <weblogic-application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com" xmlns="http://xmlns.oracle.com/weblogic/weblogic-application"> <listener> <listener-class>oracle.mds.lcm.weblogic.WLLifecycleListener</listener-class> </listener> <library-ref> <library-name>oracle.ess.thin.client</library-name> </library-ref> </weblogic-application>
EJBおよびそのジョブ定義メタデータの作成および構成には、JDeveloperを使用します。
次の手順は、各方法について説明しています。
Oracle Enterprise Schedulerのジョブ実装要件に準拠する単純な同期EJBの作成
EJBジョブ定義メタデータの作成およびエンタープライズ・アプリケーションの一部としてのデプロイ
例6-3 ejb-jar.xmlファイルのコンテンツ
<?xml version = '1.0' encoding = 'UTF-8' ?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0."
version="3.0" xmlns="http://java.sun.com/xml/ns/javaee">
<enterprise-beans>
<session>
<description>Simple Session Bean</description>
<ejb-name>SimpleSession</ejb-name> <ejb-class>oracle.com.samples.ess.thinclient.SimpleSessionBean
</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<security-identity>
<use-caller-identity/>
</security-identity>
</session>
</enterprise-beans>
</ejb-jar>
例6-4 weblogic-ejb-jar.xmlファイルのコンテンツ
<?xml version = "1.0" encoding = 'UTF-8' ?>
<weblogic-ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar http://xmlns.oracle.com"
xmlns="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar">
<weblogic-enterprise-bean>
<ejb-name>SimpleSession</ejb-name>
<stateless-session-descriptor>
<business-interface-jndi-name-map>
<business-remote>oracle.as.scheduler.RemoteExecutable</business-remote>
<jndi-name>ejb/simpleSessionBean</jndi-name>
</business-interface-jndi-name-map>
</stateless-session-descriptor>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>