Oracle® Fusion Middleware Oracle Real-Time Decisionsプラットフォーム開発者ガイド 11g リリース1 (11.1.1) B72429-01 |
|
前 |
次 |
この章では、インライン・サービスをJavaスマート・クライアントと統合する方法について、CrossSellインライン・サービスを例に説明します。
Javaスマート・クライアントAPIの詳細は、デシジョン・スタジオのオンライン・ヘルプを参照してください。
この章には次のトピックが含まれます:
Javaスマート・クライアントのサンプルで作業を行う前に、次の作業を実行する必要があります。
Java Development Kit (JDK)をインストールし、JAVA_HOME
環境変数にそのインストール場所を設定します。JDKは次のサイトから取得できます。
http://developers.sun.com/downloads
サポートされるバージョンの詳細は、第6.4項「システム要件と動作保証情報」に掲載されているドキュメントを参照してください。
Oracle RTDファイルをインストールし、Oracle RTDをアプリケーション・サーバーにデプロイします。詳細は、『Oracle Fusion Middleware Oracle Business Intelligenceインストレーション・ガイド』を参照してください。
Javaスマート・クライアントのサンプルは、サンプルのCrossSellインライン・サービスと連携して動作します。そのため、最初にOracle RTD DatabaseにCrossSellのサンプル・データを移入してから、デシジョン・スタジオを使用してCrossSellインライン・サービスをデプロイする必要があります。詳細は、『Oracle Fusion Middleware Oracle Real-Time Decisions管理者ガイド』のCrossSellサンプル・データの移入に関する項を参照してください。インライン・サービスのデプロイについては、第III部「デシジョン・スタジオ・リファレンス」を参照してください。
Real-Time Decision Serverを起動します。詳細は、『Oracle Fusion Middleware Oracle Real-Time Decisions管理者ガイド』を参照してください。
一般的に、Javaスマート・クライアントを使用した統合は、次の手順に従って実行します。
プロパティ・ファイルを準備します。
インライン・サービスへの接続を作成します。
統合点による出力の決定に必要な様々な情報(接続先統合点やセッション識別用パラメータなど)を識別するリクエストを作成します。
リクエストを起動します。
レスポンス情報をアドバイザから収集して分析します。
接続を切断します。
この項には次のトピックが含まれます:
注意: リリース11gでは、クライアント・クエストを認証する必要があります。つまり、少なくとも、コール時に資格証明のセットを提供する必要があります。デフォルトのポリシーは、ユーザー名パスワードとメッセージ・レベルの暗号化です。ユーザーはユーザー名とパスワードを入力するだけでよく、メッセージ・レベルの暗号化を明示的にリクエストする必要はありません。 |
この項では、簡単なコマンドライン・アプリケーションに統合されたCrossSellインライン・サービスを使用して、統合にJavaスマート・クライアントを使用する方法について説明します。
このサンプルのソース・コードは、次のファイルにあります。
RTD_HOME\client\Client Examples\Java Client Example\src\com\sigmadynamics\
client\example\Example.java
作業を始める前に、Example.java
を編集して、実際のユーザー名とパスワードを、2つのプロパティ設定文の第2パラメータに追加してください。
props.put("username", "your name"); props.put("password", "your password");
スマート・クライアントのサンプルを準備する手順は、次のとおりです。
デシジョン・スタジオを起動し、「ファイル」→「インポート」を選択し、既存のプロジェクトをワークスペースへを選択して「次」をクリックします。
「ルート・ディレクトリの選択」で、RTD_HOME
\client\Client Examples\Java Client Example
を参照し、「OK」をクリックします。「終了」をクリックします。
メニュー・バーから「ウィンドウ」→パースペクティブを開く→「Java」を選択します。「コンソール」ビューが表示されない場合は、「ウィンドウ」→「ビューの表示」→「コンソール」を選択します。
メニュー・バーから「実行」→「実行」を選択します。
「構成の作成、管理および実行」画面で、「Javaアプリケーション」を選択し、「新規」をクリックします。
「プロジェクト」フィールドの横にある「参照」をクリックし、「JavaSmartClientExample」を選択して「OK」をクリックします。
「メイン・クラス」フィールドの横にある「検索」をクリックし、「例」を選択して「OK」をクリックします。
「適用」→「実行」をクリックします。コンソール・ビューに、次のテキストが表示されます。
Ring! Ring! New telephone call! Enter a customer ID between 1 and 1000:
カーソルをコロンの後に移動し、顧客ID(たとえば、5)を入力し、[Enter]を押します。次のようなレスポンスが表示されます。
Here are the deals we've got for you: 1: ElectronicPayments Electronic payments eliminate the complications of handling checks. Enter the line number of the offer that catches your interest, or zero if none do:
カーソルを最後のコロンの後に移動し、「1
」を入力してオファーを選択します。サーバーによって、最後のメッセージがレスポンスされます。
プロセスが繰り返されます。プログラムを終了する場合は、1000よりも大きな顧客IDを入力します。
クライアント・アプリケーションでJavaスマート・クライアントが作成されると、コンポーネントのエンドポイント構成となるJavaスマート・クライアント・ファクトリに、プロパティのセットが渡されます。このファイルには、クライアントがサーバー・エンドポイントに接続するために必要な情報が記載されています。デフォルトの構成値を使用するファクトリ・メソッドが別に用意されていますが、明示的にプロパティを指定することをお薦めします。デフォルトのプロパティ・ファイルについては、次の手順で説明します。
ファクトリ・メソッドでは、これらのプロパティを使用してサーバーに接続します。ファクトリがサーバーに接続すると、詳細な構成情報がクライアントにダウンロードされます。これには、サーバーが使用できない状態でクライアントの実行が必要な場合にクライアントで使用する一連のデフォルト・レスポンスなどが含まれます。詳細なクライアント構成は、Javaスマート・クライアント構成キャッシュと呼ばれるローカル・ファイルに保存され、サーバーの構成が変更されると自動的に更新されます。
編集可能なサンプルのプロパティ・ファイルとして、sdclient.properties
とsdjrfclient.properties
の2つが用意されています。後者は、JRF Webサービス・クライアント・スタックを使用するユーザー向けです。
プロパティ・ファイルを作成する手順は、次のとおりです。
目的のファイル(sdclient.properties
またはsdjrfclient.properties
)をRTD_HOME
\client\Client Examples\Java Client Example\lib\
で探して、編集用に開きます。
リリース時のsdclient.properties
の内容は次のとおりです。
UseEndpointsInOrder = HTTP1 appsCacheDirectory = ${rootDir}/etc timeout = 0 HTTP1.type = http HTTP1.url = http://localhost:8080/
リリース時のsdjrfclient.properties
の内容は次のとおりです。
clientEndPointClass=com.sigmadynamics.client.jws.JwsClientEndPoint UseEndpointsInOrder = HTTP1 appsCacheDirectory = ${rootDir}/etc timeout = 0 HTTP1.type = http HTTP1.url = http://localhost:8081/
使用するサーバー構成に一致するように、ファイルの内容を変更します。表7-1に、このファイルの各要素に関する説明を示します。特に、有効なキャッシュ・ディレクトリが存在することと、エンドポイントのURLがローカルのReal-Time Decision ServerのURLとポートになっていることを確認してください。
表7-1 sdclient.propertiesおよびsdjrfclient.propertiesファイルの要素
要素 | 説明 |
---|---|
|
エンドポイント名のカンマ区切りのリスト。スマート・クライアントの初期化時に、このリストに指定された順番でサーバー・クラスタとの初期接続の確立が試行されます。初期化後は、更新されたエンドポイントのリストがサーバーによって提供されます。 このリストにあるエンドポイント名はこのプロパティ・ファイル内の定義にのみ関連し、この名前が他で使用されることはありません。 |
|
クライアント・コンポーネントがサーバーから取得した構成情報を保存する書込み可能ディレクトリを指定するファイルURL。このキャッシュによって、アプリケーションによるクライアント・コンポーネントの初期化時に、Real-Time Decision Serverが使用できない状態になった場合に使用する情報が用意されます。 |
|
クライアント・コンポーネントの初期化時に、サーバーへの初期接続の試行に適用されるタイムアウト時間(ミリ秒単位)。サーバーに接続すると、サーバーのタイムアウト時間である |
|
指定されたエンドポイントのタイプ。現時点では、HTTPのみがサポートされています。 |
|
サーバーのHTTPエンドポイントのHTTPホストとポートを指定するURL。 |
username |
サーバーとの接続に使用するユーザー名。 |
password |
サーバーとの接続に使用するパスワード。 |
Javaスマート・クライアントを作成するには、次の場所にあるサンプル・アプリケーションのソース・ファイルを開きます。
RTD_HOME
\client\Client Examples\Java Client Example\src\com\sigmadynamics\
client\example\Example.java
ヒント: このサンプルのソース・コードを、各自のJavaスマート・クライアント実装のテンプレートとして使用できます。 |
Oracle RTD統合をサポートするために、次のインポートが使用されます。
import com.sigmadynamics.client.IntegrationPointRequestInterface; import com.sigmadynamics.client.IntegrationPointResponseInterface; import com.sigmadynamics.client.SDClientException; import com.sigmadynamics.client.SDClientFactory; import com.sigmadynamics.client.SDClientInterface;
サンプル・アプリケーションのメイン・メソッドには、サンプル・アプリケーションに指定された引数に基づいて、SDClientFactory
を使用してSDClientInterface
実装を作成するコードが記述されています。
これらの引数はgetClient
に渡され、そこで適切なファクトリ・メソッドが識別されます。
SDClientInterface client = getClient(args);
Javaスマート・クライアントの作成に使用されるファクトリ・メソッドは複数あります。次のように、getClient
のコードを調べることで、様々なメソッドを確認できます。
private static SDClientInterface getClient(String[] args) { try { Properties props = null; if (args.length == 0) { //The default properties file is referenced. props = getDefaultHttpAddressProperties(); } if ("-h".equals(args[0])) { if (args.length < 2) //This prepares property with the default HTTP address of http://localhost:8080. //This is the default installation URL and port of Real-Time Decision Server. //Uses createHttp(java.lang.String, int, boolean). props = getDefaultHttpAddressProperties(); else //This prepares property with a supplied HTTP address. //This is the address and port of your Real-Time Decision Server, // if it is not at the default address. Uses createHttp(String). props = getHttpAddressProperties(args[1]); } if ("-u".equals(args[0])) { if (args.length < 2) { System.out.println("Missing properties file URL argument"); System.exit(-1); } //This prepares property with the information supplied in the properties file at //the address specified. Uses createFromProperties. props = getPropertiesFromURL(args[1]); } if ("-f".equals(args[0])) { if (args.length < 2) { System.out.println("Missing properties filename argument"); System.exit(-1); } //This prepares property with the information supplied in the properties file. //Uses createFromPropertiesURL. props = getPropertiesFromFileName(args[1]); } //This sets username and password for RTD Decision service security. props.put("username", "your name"); props.put("password", "your password"); // This creates RTD Client based on configuration properties. return SDClientFactory.createFromProperties(props); } catch (SDClientException e) { e.printStackTrace(); } System.out.println("Unrecognized argument"); System.exit(-1); return null; }
これらのメソッドの概要は、デシジョン・スタジオのオンライン・ヘルプのJavaスマート・クライアントAPIに関する項を参照してください。
リクエストが移入されると、クライアント・アプリケーションでは、SDClientInterface
のinvoke
メソッドをコールしてリクエストをサーバーに送信し、サーバーによって計算処理された選択肢の配列を表すIntegrationPointResponseInterface
を受信します。
IntegrationPointResponseInterface invoke(IntegrationPointRequestInterface request);
サンプル・アプリケーションでは、次のようにコールされます。
client.invoke(request);
注意: レスポンスが不要なリクエストやメッセージ配信順序が重要でないリクエストをクライアント・アプリケーションで送信する場合、
|
CallStart統合点へのリクエストが起動されると、新しいリクエストが準備され、CallInfoに対して起動されます。
// Supply some additional information about the telephone call. // Apparently the CrossSell service expects very little here -- // just the channel again, which it already knows. Hence this message // could be left out with no consequences. request = client.createRequest(INLINE_SERVICE_NAME, "CallInfo"); request.setSessionKey( SESSION_KEY, sCustID ); request.setArg( "channel", "Call"); client.invoke(request);
アドバイザが起動されると、特定数のレスポンス・アイテム(選択肢とも呼ばれる)が返されます。使用するアプリケーションには、返される数だけのレスポンス・アイテムを処理するコードが必要です。詳細は、第6.2.3項「アドバイザのレスポンスの決定」を参照してください。
クライアント・アプリケーションでは、invokeメソッドによって返されたIntegrationPointResponseInterface
を介して、それらの選択肢にアクセスできます。IntegrationPointResponseInterface
により、レスポンス・アイテム・オブジェクトの配列であるResponseItemInterface
にアクセスできます。ResponseItemInterfaceの各レスポンス・アイテムは、アドバイザのデシジョンによって選択された選択肢オブジェクトに対応します。
com.sigmadynamics.client
パッケージは、各選択肢を値文字列のコレクションとして抽出し、名前文字列によって区別します。
このサンプルでは、リクエストをアドバイザの統合点に対して起動するとき、レスポンスの受信を準備します。
// Based on what the server knows about this customer, ask for some // product recommendations. request = client.createRequest(INLINE_SERVICE_NAME, "OfferRequest"); IntegrationPointResponseInterface response = client.invoke(request); request.setSessionKey( SESSION_KEY, sCustID );
返されるレスポンスの数が判明している場合は、処理を正確に記述できます。レスポンスは配列から読み取られ、顧客に表示されます。
if ( response.size() > 0 ){ // Since I know that CrossSell's OfferDecision returns only // one Choice, I could get that choice from the response with // response.get(0); Instead, I'll pretend that // multiple offers could be returned instead of just one. System.out.println(); System.out.println("Here are the deals we've got for you:"); ResponseItemInterface[] items = response.getResponseItems(); for ( int i = 0; i < items.length; i++ ){ System.out.println(" " + (i+1) + ": " + items[i].getId()); String message = items[i].getValue("message"); if ( message != null ) System.out.println(" " + message ); } System.out.println(); System.out.println("Enter the line number of the offer that catches your interest, or zero if none do: " );
多くのインライン・サービスは自己学習が行われるように設計されています。CrossSellインライン・サービスでは、OfferResponseインフォーマントにより、抱合せ販売オファーに対する関心度が選択肢イベント・モデルにフィードバックされます。
// Tell the server the good news. request = client.createRequest(INLINE_SERVICE_NAME, "OfferResponse"); request.setSessionKey( SESSION_KEY, sCustID ); request.setArg( "choiceName", prodName ); // "Interested" is one of the Choice Events defined for the choice group, Offers.
選択肢イベント・モデルと選択肢を特定するには、第6.2.4項「Oracle RTDへのイベント・レスポンスの特定」を参照してください。
request.setArg( "choiceOutcome", "Interested" ); client.invoke(request);
最後に、CallResolutionインフォーマント(サンプルのCrossSellでセッションの終了用に設計されている)をサーバーにおいて起動することでセッションがクローズします。
// Close the server's session. request = client.createRequest(INLINE_SERVICE_NAME, "CallResolution"); request.setSessionKey( SESSION_KEY, sCustID ); client.invoke(request);
クライアント・アプリケーションでSDClientInterface
の使用を終了して再利用しない場合は、コンポーネントのcloseメソッドをコールし、インスタンス固有の情報を解放します。
client.close();