ヘッダーをスキップ
Oracle Real-Time Decisionsプラットフォーム開発者ガイド
リリース3.0
B54059-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

7 Javaスマート・クライアントの使用

この章では、統合にJavaスマート・クライアントを使用する方法について説明します。サンプルがOracle RTDインストールに付属しています。

Javaスマート・クライアントAPIの詳細は、Decision Studioのオンライン・ヘルプを参照してください。

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

7.1 作業前の準備

Javaスマート・クライアントのサンプルで作業を行う前に、次の作業を実行する必要があります。

  1. Java Development Kit(JDK)をインストールし、JAVA_HOME環境変数にそのインストール場所を設定します。JDKの入手方法の詳細は、次のURLでSun社のWebサイトを参照してください。

    http://java.sun.com/products

  2. Oracle RTDファイルをインストールし、Oracle RTDをアプリケーション・サーバーにデプロイします。詳細は、『Oracle Real-Time Decisionsインストレーションおよび管理ガイド』を参照してください。

  3. Javaスマート・クライアントのサンプルは、サンプルのCrossSellインライン・サービスと連携して動作します。そのため、最初にOracle RTD DatabaseにCrossSellのサンプル・データを移入してから、Decision Studioを使用してCrossSellインライン・サービスをデプロイする必要があります。

    Oracle RTD DatabaseにCrossSellのサンプル・データを移入する方法の詳細は、『Oracle Real-Time Decisionsインストレーションおよび管理ガイド』を参照してください。インライン・サービスのデプロイ方法の詳細は、第III部「Decision Studioリファレンス」を参照してください。

  4. Real-Time Decision Serverを起動します。詳細は、『Oracle Real-Time Decisionsインストレーションおよび管理ガイド』を参照してください。

7.2 Javaスマート・クライアントによるインライン・サービスとの統合

一般的に、Javaスマート・クライアントを使用した統合は、次の手順に従って実行します。

  1. プロパティ・ファイルを準備します。

  2. インライン・サービスへの接続を作成します。

  3. 統合点による出力の決定に必要な様々な情報(接続先統合点やセッション識別用パラメータなど)を識別するリクエストを作成します。

  4. リクエストを起動します。

  5. レスポンス情報をアドバイザから収集して分析します。

  6. 接続を切断します。

この項の内容は次のとおりです。

7.2.1 Javaスマート・クライアントのサンプルの準備

この項では、簡単なコマンドライン・アプリケーションに統合されたCrossSellインライン・サービスを使用して、統合にJavaスマート・クライアントを使用する方法について説明します。

スマート・クライアントのサンプルを準備する手順は、次のとおりです。

  1. 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
    

    ファイルを保存して閉じます。

  2. Decision Studioを起動し、「File」→「Import」→「Existing Projects into Workspace」を選択し、「Next」をクリックします。

  3. Select root directory」で、RTD_HOME\client\Client Examples\Java Client Exampleを参照し、「OK」をクリックします。「Finish」をクリックします。

  4. メニュー・バーから、「Window」→「Open Perspective」→「Java」を選択します。コンソール・ビューが表示されない場合は、「Window」→「Show View」→「Console」を選択します。

  5. メニュー・バーから、「Run」→「Run」を選択します。

  6. 「Create, manage, and run configurations」画面で、「Java Application」を選択し、「New」をクリックします。

  7. Project」フィールドの横にある「Browse」をクリックし、「JavaSmartClientExample」を選択して「OK」をクリックします。

  8. Main class」フィールドの横にある「Search」をクリックし、「Example」を選択して「OK」をクリックします。

  9. Apply」→「Run」をクリックします。コンソール・ビューに、次のテキストが表示されます。

    Ring! Ring! New telephone call!
    Enter a customer ID between 1 and 1000:
    
  10. カーソルをコロンの後に移動し、顧客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:
    
  11. カーソルを最後のコロンの後に移動し、「1」を入力してオファーを選択します。サーバーによって、最後のメッセージがレスポンスされます。

  12. プロセスが繰り返されます。プログラムを終了する場合は、1000よりも大きな顧客IDを入力します。

このサンプルのソース・コードは、次のファイルにあります。

RTD_HOME\client\Client Examples\Java Client Example\src\com\sigmadynamics\
client\example\Example.java

次の各項で、このサンプルについて説明します。

7.2.2 Javaスマート・クライアントのプロパティ・ファイルの作成

クライアント・アプリケーションでJavaスマート・クライアントが作成されると、コンポーネントのエンドポイント構成となるJavaスマート・クライアント・ファクトリに、プロパティのセットが渡されます。このファイルには、クライアントがサーバー・エンドポイントに接続するために必要な情報が記載されています。デフォルトの構成値を使用するファクトリ・メソッドが別に用意されていますが、明示的にプロパティを指定することをお薦めします。デフォルトのプロパティ・ファイルについては、次の手順で説明します。

ファクトリ・メソッドでは、このプロパティを使用してサーバーに接続します。ファクトリがサーバーに接続すると、詳細な構成情報がクライアントにダウンロードされます。これには、サーバーが使用できない状態になったときに、クライアントで実行が必要な一連のデフォルト・レスポンスなどが含まれます。詳細なクライアント構成は、Javaスマート・クライアント構成キャッシュと呼ばれるローカル・ファイルに保存され、サーバーの構成が変更されると自動的に更新されます。

プロパティ・ファイルを作成する手順は、次のとおりです。

  1. 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/
    
  2. 使用するサーバー構成に一致するように、ファイルの内容を変更します。表7-1に、このファイルの各要素に関する説明を示します。特に、有効なキャッシュ・ディレクトリが存在することと、エンドポイントのURLがローカルのReal-Time Decision ServerのURLとポートになっていることを確認してください。デフォルトでは、このURLはhttp://localhost:8080です。

表7-1 sdclient.propertiesファイルの要素

要素 説明

UseEndpointsInOrder

エンドポイント名のカンマ区切りのリスト。スマート・クライアントの初期化時に、このリストに指定された順番でサーバー・クラスタへの初期接続の確立が試行されます。初期化後は、サーバーによってエンドポイント・リストが更新されるため、このリストは無効になります。

このリストにあるエンドポイント名はこのプロパティ・ファイル内の定義にのみ関連し、この名前が他で使用されることはありません。

appsCacheDirectory

クライアント・コンポーネントがサーバーから取得した構成情報を保存する書込み可能ディレクトリを指定するファイルURL。このキャッシュによって、アプリケーションによるクライアント・コンポーネントの初期化時に、Real-Time Decision Serverが使用できない状態になった場合に使用する情報が用意されます。sdclient.propertiesでは、キャッシュ・ディレクトリとして既存のディレクトリを指定する必要があります。存在しない場合は、Java仮想マシンの一時ディレクトリが使用されます。

timeout

クライアント・コンポーネントの初期化時に、サーバーへの初期接続の試行に適用されるタイムアウト時間(ミリ秒単位)。サーバーに接続すると、サーバーのタイムアウト時間であるIntegrationPointGuaranteedRequestTimeout(JMX MBeanプロパティによって構成)が使用されます。

endpoint_name.type

指定されたエンドポイントのタイプ。現時点では、HTTPのみがサポートされています。

endpointName.url

サーバーのHTTPエンドポイントのHTTPホストとポートを指定するURL。デフォルトのエンドポイントは、http://localhost:8080です。


7.2.3 Javaスマート・クライアントの作成

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に関する項を参照してください。

7.2.4 リクエストの作成

リクエストが移入されると、クライアント・アプリケーションでは、SDClientInterfaceinvokeメソッドをコールしてリクエストをサーバーに送信し、サーバーによって計算処理された選択肢の配列を表すIntegrationPointResponseInterfaceを受信します。

IntegrationPointResponseInterface invoke(IntegrationPointRequestInterface request);

サンプル・アプリケーションでは、次のようにコールされます。

client.invoke(request);

注意:

レスポンスが不要なリクエストやメッセージ配信順序が重要でないリクエストをクライアント・アプリケーションで送信する場合、invokeメソッドではなくinvokeAsyncメソッドを使用できます。

invokeAsyncをコールして送信されるリクエストは、それ以降invokeAsyncinvokeをコールして送信されるリクエストよりも前に、サーバーに到着するとはかぎりません。メッセージ配信順序が重要な場合、レスポンスが不要でも、invokeAsyncメソッドではなくinvokeメソッドを使用してください。


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);

7.2.5 レスポンスの確認

アドバイザが起動されると、特定数のレスポンス・アイテム(選択肢とも呼ばれる)が返されます。使用するアプリケーションには、返される数だけのレスポンス・アイテムを処理するコードが必要です。詳細は、第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: " );

7.2.6 ループのクローズ

多くのインライン・サービスは自己学習が行われるように設計されています。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);

7.2.7 クライアントのクローズ

クライアント・アプリケーションでSDClientInterfaceの使用を終了して再利用しない場合は、コンポーネントのcloseメソッドをコールし、インスタンス固有の情報を解放します。

client.close();