ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Real-Time Decisionsプラットフォーム開発者ガイド
11g リリース1 (11.1.1)
B72429-01
  目次へ移動
目次

前
 
次
 

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

この章では、インライン・サービスをJavaスマート・クライアントと統合する方法について、CrossSellインライン・サービスを例に説明します。

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

この章には次のトピックが含まれます:

7.1 作業前の準備

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

  1. Java Development Kit (JDK)をインストールし、JAVA_HOME環境変数にそのインストール場所を設定します。JDKは次のサイトから取得できます。

    http://developers.sun.com/downloads

    サポートされるバージョンの詳細は、第6.4項「システム要件と動作保証情報」に掲載されているドキュメントを参照してください。

  2. Oracle RTDファイルをインストールし、Oracle RTDをアプリケーション・サーバーにデプロイします。詳細は、『Oracle Fusion Middleware Oracle Business Intelligenceインストレーション・ガイド』を参照してください。

  3. Javaスマート・クライアントのサンプルは、サンプルのCrossSellインライン・サービスと連携して動作します。そのため、最初にOracle RTD DatabaseにCrossSellのサンプル・データを移入してから、デシジョン・スタジオを使用してCrossSellインライン・サービスをデプロイする必要があります。詳細は、『Oracle Fusion Middleware Oracle Real-Time Decisions管理者ガイド』のCrossSellサンプル・データの移入に関する項を参照してください。インライン・サービスのデプロイについては、第III部「デシジョン・スタジオ・リファレンス」を参照してください。

  4. Real-Time Decision Serverを起動します。詳細は、『Oracle Fusion Middleware Oracle Real-Time Decisions管理者ガイド』を参照してください。

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

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

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

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

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

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

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

  6. 接続を切断します。

この項には次のトピックが含まれます:

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

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

  1. デシジョン・スタジオを起動し、「ファイル」→「インポート」を選択し、既存のプロジェクトをワークスペースへを選択して「次」をクリックします。

  2. 「ルート・ディレクトリの選択」で、RTD_HOME\client\Client Examples\Java Client Exampleを参照し、「OK」をクリックします。「終了」をクリックします。

  3. メニュー・バーから「ウィンドウ」→パースペクティブを開く→「Java」を選択します。「コンソール」ビューが表示されない場合は、「ウィンドウ」→「ビューの表示」→「コンソール」を選択します。

  4. メニュー・バーから「実行」→「実行」を選択します。

  5. 「構成の作成、管理および実行」画面で、「Javaアプリケーション」を選択し、「新規」をクリックします。

  6. 「プロジェクト」フィールドの横にある「参照」をクリックし、「JavaSmartClientExample」を選択して「OK」をクリックします。

  7. 「メイン・クラス」フィールドの横にある「検索」をクリックし、「例」を選択して「OK」をクリックします。

  8. 「適用」「実行」をクリックします。コンソール・ビューに、次のテキストが表示されます。

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

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

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

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

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

編集可能なサンプルのプロパティ・ファイルとして、sdclient.propertiessdjrfclient.propertiesの2つが用意されています。後者は、JRF Webサービス・クライアント・スタックを使用するユーザー向けです。

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

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

表7-1 sdclient.propertiesおよびsdjrfclient.propertiesファイルの要素

要素 説明

UseEndpointsInOrder

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

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

appsCacheDirectory

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

timeout

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

endpoint_name.type

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

endpointName.url

サーバーのHTTPエンドポイントのHTTPホストとポートを指定するURL。

username

サーバーとの接続に使用するユーザー名。

password

サーバーとの接続に使用するパスワード。


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

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.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: " );

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

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

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

client.close();