この章では、統合にJavaスマート・クライアントを使用する方法について説明します。サンプルがOracle RTDインストールに付属しています。
Javaスマート・クライアントAPIの詳細は、Decision Studioのオンライン・ヘルプを参照してください。
この章の内容は次のとおりです。
Javaスマート・クライアントのサンプルで作業を行う前に、次の作業を実行する必要があります。
Java Development Kit(JDK)をインストールし、JAVA_HOME
環境変数にそのインストール場所を設定します。JDKの入手方法の詳細は、次のURLでSun社のWebサイトを参照してください。
Oracle RTDファイルをインストールし、Oracle RTDをアプリケーション・サーバーにデプロイします。詳細は、『Oracle Real-Time Decisionsインストレーションおよび管理ガイド』を参照してください。
Javaスマート・クライアントのサンプルは、サンプルのCrossSellインライン・サービスと連携して動作します。そのため、最初にOracle RTD DatabaseにCrossSellのサンプル・データを移入してから、Decision Studioを使用してCrossSellインライン・サービスをデプロイする必要があります。
Oracle RTD DatabaseにCrossSellのサンプル・データを移入する方法の詳細は、『Oracle Real-Time Decisionsインストレーションおよび管理ガイド』を参照してください。インライン・サービスのデプロイ方法の詳細は、第III部「Decision Studioリファレンス」を参照してください。
Real-Time Decision Serverを起動します。詳細は、『Oracle Real-Time Decisionsインストレーションおよび管理ガイド』を参照してください。
一般的に、Javaスマート・クライアントを使用した統合は、次の手順に従って実行します。
プロパティ・ファイルを準備します。
インライン・サービスへの接続を作成します。
統合点による出力の決定に必要な様々な情報(接続先統合点やセッション識別用パラメータなど)を識別するリクエストを作成します。
リクエストを起動します。
レスポンス情報をアドバイザから収集して分析します。
接続を切断します。
この項の内容は次のとおりです。
この項では、簡単なコマンドライン・アプリケーションに統合されたCrossSellインライン・サービスを使用して、統合にJavaスマート・クライアントを使用する方法について説明します。
スマート・クライアントのサンプルを準備する手順は、次のとおりです。
RTD_HOME
\client\Client Examples\Java Client Example\lib\sdbootstrap.properties
ファイルのある場所に移動してファイルを開き、編集します。次に示すように、client=true
以外のすべてのプロパティをコメント化します。
client=true #StudioStaticFilesLocation=shared_ui/studio #WebServerLocation=http://localhost:8080 #WorkbenchServlet=/ui/workbench
ファイルを保存して閉じます。
Decision Studioを起動し、「File」→「Import」→「Existing Projects into Workspace」を選択し、「Next」をクリックします。
「Select root directory」で、RTD_HOME
\client\Client Examples\Java Client Example
を参照し、「OK」をクリックします。「Finish」をクリックします。
メニュー・バーから、「Window」→「Open Perspective」→「Java」を選択します。コンソール・ビューが表示されない場合は、「Window」→「Show View」→「Console」を選択します。
メニュー・バーから、「Run」→「Run」を選択します。
「Create, manage, and run configurations」画面で、「Java Application」を選択し、「New」をクリックします。
「Project」フィールドの横にある「Browse」をクリックし、「JavaSmartClientExample」を選択して「OK」をクリックします。
「Main class」フィールドの横にある「Search」をクリックし、「Example」を選択して「OK」をクリックします。
「Apply」→「Run」をクリックします。コンソール・ビューに、次のテキストが表示されます。
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を入力します。
このサンプルのソース・コードは、次のファイルにあります。
RTD_HOME\client\Client Examples\Java Client Example\src\com\sigmadynamics\
client\example\Example.java
次の各項で、このサンプルについて説明します。
クライアント・アプリケーションでJavaスマート・クライアントが作成されると、コンポーネントのエンドポイント構成となるJavaスマート・クライアント・ファクトリに、プロパティのセットが渡されます。このファイルには、クライアントがサーバー・エンドポイントに接続するために必要な情報が記載されています。デフォルトの構成値を使用するファクトリ・メソッドが別に用意されていますが、明示的にプロパティを指定することをお薦めします。デフォルトのプロパティ・ファイルについては、次の手順で説明します。
ファクトリ・メソッドでは、このプロパティを使用してサーバーに接続します。ファクトリがサーバーに接続すると、詳細な構成情報がクライアントにダウンロードされます。これには、サーバーが使用できない状態になったときに、クライアントで実行が必要な一連のデフォルト・レスポンスなどが含まれます。詳細なクライアント構成は、Javaスマート・クライアント構成キャッシュと呼ばれるローカル・ファイルに保存され、サーバーの構成が変更されると自動的に更新されます。
プロパティ・ファイルを作成する手順は、次のとおりです。
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/
使用するサーバー構成に一致するように、ファイルの内容を変更します。表7-1に、このファイルの各要素に関する説明を示します。特に、有効なキャッシュ・ディレクトリが存在することと、エンドポイントのURLがローカルのReal-Time Decision ServerのURLとポートになっていることを確認してください。デフォルトでは、このURLはhttp://localhost:8080
です。
表7-1 sdclient.propertiesファイルの要素
要素 | 説明 |
---|---|
|
エンドポイント名のカンマ区切りのリスト。スマート・クライアントの初期化時に、このリストに指定された順番でサーバー・クラスタへの初期接続の確立が試行されます。初期化後は、サーバーによってエンドポイント・リストが更新されるため、このリストは無効になります。 このリストにあるエンドポイント名はこのプロパティ・ファイル内の定義にのみ関連し、この名前が他で使用されることはありません。 |
|
クライアント・コンポーネントがサーバーから取得した構成情報を保存する書込み可能ディレクトリを指定するファイルURL。このキャッシュによって、アプリケーションによるクライアント・コンポーネントの初期化時に、Real-Time Decision Serverが使用できない状態になった場合に使用する情報が用意されます。 |
|
クライアント・コンポーネントの初期化時に、サーバーへの初期接続の試行に適用されるタイムアウト時間(ミリ秒単位)。サーバーに接続すると、サーバーのタイムアウト時間である |
|
指定されたエンドポイントのタイプ。現時点では、HTTPのみがサポートされています。 |
|
サーバーのHTTPエンドポイントのHTTPホストとポートを指定するURL。デフォルトのエンドポイントは、 |
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{ if ( args.length == 0 ) return getClientWithDefaultPropertiesFile();
create(java.lang.String)
を使用してデフォルトのプロパティ・ファイルに基づいてJavaスマート・クライアントが作成されます。デフォルトのプロパティ・ファイルが参照されます。
if ( "-h".equals(args[0])){ if ( args.length < 2 ) return getClientWithDefaultHttpAddress();
デフォルトのHTTPアドレスのhttp://localhost:8080
を使用してJavaスマート・クライアントが作成されます。これは、Real-Time Decision ServerにおけるデフォルトのインストールURLおよびポートです。createHttp(java.lang.String, int, boolean)
が使用されます。
return getClientWithHttpAddress( args[1]); }
指定されたHTTPアドレスを使用してJavaスマート・クライアントが作成されます。これは、デフォルト・アドレスにないReal-Time Decision Serverのアドレスおよびポートです。createHttp(String)
が使用されます。
if ( "-u".equals(args[0])){ if ( args.length < 2 ) { System.out.println("Missing properties file URL argument" ); System.exit(-1); } return getClientWithPropertiesFileURL( args[1] ); }
指定されたアドレスにあるプロパティ・ファイルに記述されている情報を使用してJavaスマート・クライアントが作成されます。createFromProperties
が使用されます。
if ( "-f".equals(args[0])){ if ( args.length < 2 ) { System.out.println("Missing properties filename argument" ); System.exit(-1); } return getClientWithPropertiesFileName( args[1] ); }
プロパティ・ファイルに記述されている情報を使用してJavaスマート・クライアントが作成されます。createFromPropertiesURL
が使用されます。
System.out.println("Unrecognized argument"); }catch (SDClientException e ){ e.printStackTrace(); } System.exit(-1); return null; }
これらのメソッドの概要は、Decision Studioのオンライン・ヘルプのJavaスマート・クライアントAPIに関する項を参照してください。
リクエストが移入されると、クライアント・アプリケーションでは、SDClientInterface
のinvoke
メソッドをコールしてリクエストをサーバーに送信し、サーバーによって計算処理された選択肢の配列を表すIntegrationPointResponseInterface
を受信します。
IntegrationPointResponseInterface invoke(IntegrationPointRequestInterface request);
サンプル・アプリケーションでは、次のようにコールされます。
client.invoke(request);
注意: レスポンスが不要なリクエストやメッセージ配信順序が重要でないリクエストをクライアント・アプリケーションで送信する場合、invoke メソッドではなくinvokeAsync メソッドを使用できます。
|
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.2項「アドバイザのレスポンスの決定」を参照してください。
クライアント・アプリケーションでは、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.3項「サーバーにレスポンスする方法の理解」を参照してください。
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();