第20章 Realtime Decision Server 機能

20.1. 概要

Realtime Decision Server は、ルールおよびプロセスのインスタンスを作成して実行するのに使用される、モジュール式のスタンドアロンサーバーコンポーネントです。この機能は REST、JMS、および Java の各インターフェースからクライアントアプリケーションに公開されます。

Realtime Decision Server は、主に WAR ファイルとしてパッケージ化される、設定可能な web アプリケーションです。そのディストリビューションは、純粋な web コンテナー (Tomcat など)、JEE 6 コンテナー、および JEE 7 コンテナーで利用できます。

Realtime Decision Server は、拡張の概念に基づいて設定されます。拡張機能は、それぞれ個別に有効または無効にできるため、ニーズに合わせてサーバーを設定できます。

20.2. Business Resource Planner REST API

Planner 機能を有効にすると、Realtime Decision Server は以下に記す追加 REST API に対応します。この API は JMS および Java クライアント API から利用できます。以下の点に注意してください。

  • Realtime Decision Server をデプロイするには、『Red Hat JBoss BRMS のユーザーガイド』の「Realtime Decision Server」の章を参照してください。
  • ベース URL は、上記で定義したエンドポイント (たとえば http://SERVER:PORT/kie-server/services/rest/server/) のままになります。
  • リクエストするユーザーには、kie-server ロールが必要です。
  • 特定のマーシャリングフォーマットが必要な場合は、以下のように、HTTP ヘッダー Content-Type と、任意で X-KIE-ContentType を HTTP リクエストに追加します。

    Content-Type: application/xml
    X-KIE-ContentType: xstream

以下の例で使用している要求と応答では、OptaPlanner Workbench の optacloud サンプルを使用して KIE コンテナーを構築していること (以下のように、/services/rest/server/containers/optacloud-kiecontainer-1PUT を呼び出す) が前提となっています。

<kie-container container-id="optacloud-kiecontainer-1">
  <release-id>
    <group-id>opta</group-id>
    <artifact-id>optacloud</artifact-id>
    <version>1.0.0</version>
  </release-id>
</kie-container>

20.2.1. [GET] /containers/{containerId}/solvers

コンテナーで作成した Solver の一覧を返します。

例20.1 サーバーの応答例 (XStream)

<org.kie.server.api.model.ServiceResponse>
<type>SUCCESS</type>
<msg>Solvers list successfully retrieved from container 'optacloud-kiecontainer-1'</msg>
<result class="org.kie.server.api.model.instance.SolverInstanceList">
  <solvers>
    <solver-instance>
      <container-id>optacloud-kiecontainer-1</container-id>
      <solver-id>solver1</solver-id>
      <solver-config-file>opta/optacloud/cloudSolverConfig.solver.xml</solver-config-file>
      <status>NOT_SOLVING</status>
    </solver-instance>
    <solver-instance>
      <container-id>optacloud-kiecontainer-1</container-id>
      <solver-id>solver2</solver-id>
      <solver-config-file>opta/optacloud/cloudSolverConfig.solver.xml</solver-config-file>
      <status>NOT_SOLVING</status>
    </solver-instance>
  </solvers>
</result>
</org.kie.server.api.model.ServiceResponse>

例20.2 サーバーの応答例 (JSON)

{
"type" : "SUCCESS",
"msg" : "Solvers list successfully retrieved from container 'optacloud-kiecontainer-1'",
"result" : {
  "solver-instance-list" : {
    "solver" : [ {
      "status" : "NOT_SOLVING",
      "container-id" : "optacloud-kiecontainer-1",
      "solver-id" : "solver1",
      "solver-config-file" : "opta/optacloud/cloudSolverConfig.solver.xml"
    }, {
      "status" : "NOT_SOLVING",
      "container-id" : "optacloud-kiecontainer-1",
      "solver-id" : "solver2",
      "solver-config-file" : "opta/optacloud/cloudSolverConfig.solver.xml"
    } ]
  }
}
}

20.2.2. [PUT] /containers/{containerId}/solvers/{solverId}

コンテナー {containerId} に、指定の {solverId} で新しい Solver を作成します。リクエストの本文は、マーシャリングされた SolverInstance エンティティーになり、Solver の設定ファイルに指定する必要があります。

以下は、要求と、それに対応する応答の例です。

例20.3 サーバーのリクエストの例 (XStream)

<solver-instance>
  <solver-config-file>opta/optacloud/cloudSolverConfig.solver.xml</solver-config-file>
</solver-instance>

例20.4 サーバーの応答例 (XStream)

<org.kie.server.api.model.ServiceResponse>
  <type>SUCCESS</type>
  <msg>Solver 'solver1' successfully created in container 'optacloud-kiecontainer-1'</msg>
  <result class="solver-instance">
    <container-id>optacloud-kiecontainer-1</container-id>
    <solver-id>solver1</solver-id>
    <solver-config-file>opta/optacloud/cloudSolverConfig.solver.xml</solver-config-file>
    <status>NOT_SOLVING</status>
  </result>
</org.kie.server.api.model.ServiceResponse>

例20.5 サーバーのリクエストの例 (JSON)

{
  "solver-config-file" : "opta/optacloud/cloudSolverConfig.solver.xml"
}

例20.6 サーバーの応答例 (JSON)

{
  "type" : "SUCCESS",
  "msg" : "Solver 'solver1' successfully created in container 'optacloud-kiecontainer-1'",
  "result" : {
    "solver-instance" : {
      "container-id" : "optacloud-kiecontainer-1",
      "solver-id" : "solver1",
      "solver-config-file" : "opta/optacloud/cloudSolverConfig.solver.xml",
      "status" : "NOT_SOLVING"
    }
  }
}

20.2.3. [GET] /containers/{containerId}/solvers/{solverId}

コンテナー {containerId} で Solver {solverId} に関する現在のステータスを返します。

例20.7 サーバーの応答例 (XStream)

<org.kie.server.api.model.ServiceResponse>
  <type>SUCCESS</type>
  <msg>Solver 'solver1' state successfully retrieved from container 'optacloud-kiecontainer-1'</msg>
  <result class="solver-instance">
    <container-id>optacloud-kiecontainer-1</container-id>
    <solver-id>solver1</solver-id>
    <solver-config-file>opta/optacloud/cloudSolverConfig.solver.xml</solver-config-file>
    <status>NOT_SOLVING</status>
  </result>
</org.kie.server.api.model.ServiceResponse>

例20.8 サーバーの応答例 (JSON)

{
  "type" : "SUCCESS",
  "msg" : "Solver 'solver1' state successfully retrieved from container 'optacloud-kiecontainer-1'",
  "result" : {
    "solver-instance" : {
      "container-id" : "optacloud-kiecontainer-1",
      "solver-id" : "solver1",
      "solver-config-file" : "opta/optacloud/cloudSolverConfig.solver.xml",
      "status" : "NOT_SOLVING"
    }
  }
}

20.2.4. 解決の開始

以下は、2 台のコンピューターと 1 つのプロセスで発生した optacloud 問題を解決する例です。

例20.9 サーバーのリクエストの例 (XStream)

<solver-instance>
  <status>SOLVING</status>
  <planning-problem class="opta.optacloud.CloudSolution">
    <computerList>
      <opta.optacloud.Computer>
        <cpuPower>10</cpuPower>
        <memory>4</memory>
        <networkBandwidth>100</networkBandwidth>
        <cost>1000</cost>
      </opta.optacloud.Computer>
      <opta.optacloud.Computer>
        <cpuPower>20</cpuPower>
        <memory>8</memory>
        <networkBandwidth>100</networkBandwidth>
        <cost>3000</cost>
      </opta.optacloud.Computer>
    </computerList>
    <processList>
      <opta.optacloud.Process>
        <requiredCpuPower>1</requiredCpuPower>
        <requiredMemory>7</requiredMemory>
        <requiredNetworkBandwidth>1</requiredNetworkBandwidth>
      </opta.optacloud.Process>
    </processList>
  </planning-problem>
</solver-instance>

応答には、最適解が含まれていません。解決するには数秒、数分、数時間、または数日かかる場合があり、HTTP 要求がタイムアウトになるためです。

例20.10 サーバーの応答例 (XStream)

<org.kie.server.api.model.ServiceResponse>
  <type>SUCCESS</type>
  <msg>Solver 'solver1' from container 'optacloud-kiecontainer-1' successfully updated.</msg>
  <result class="solver-instance">
    <container-id>optacloud-kiecontainer-1</container-id>
    <solver-id>solver1</solver-id>
    <solver-config-file>opta/optacloud/cloudSolverConfig.solver.xml</solver-config-file>
    <status>SOLVING</status>
  </result>
</org.kie.server.api.model.ServiceResponse>

代わりに、解決は非同期に行われるため、最適解を得るには、bestsolution URL を呼び出す必要があります。

20.2.5. 解決の終了

たとえば、解決を終了するには、以下のようにします。

例20.11 サーバーのリクエストの例 (XStream)

<solver-instance>
  <status>NOT_SOLVING</status>
</solver-instance>

例20.12 サーバーの応答例 (XStream)

<org.kie.server.api.model.ServiceResponse>
  <type>SUCCESS</type>
  <msg>Solver 'solver1' from container 'optacloud-kiecontainer-1' successfully updated.</msg>
  <result class="solver-instance">
    <container-id>optacloud-kiecontainer-1</container-id>
    <solver-id>solver1</solver-id>
    <solver-config-file>opta/optacloud/cloudSolverConfig.solver.xml</solver-config-file>
    <status>TERMINATING_EARLY</status>
    <score class="org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore">
      <hardScore>0</hardScore>
      <softScore>-3000</softScore>
    </score>
  </result>
</org.kie.server.api.model.ServiceResponse>

Solver は削除されないため、終了しても最適解は取得できます。

20.2.6. [GET] /containers/{containerId}/solvers/{solverId}/bestsolution

リクエストの作成時に見つかった最適解を返します。Solver は終了していないため (つまり status フィールドは SOLVING のままなので)、返される最適解は、その時点での最適解であり、後で別の解が返される可能性もあります。

たとえば、上述の問題は、以下の解 (ソリューション) を返します。ここでは、(1 台目のコンピューターではメモリーが不足しているため) 2 台目のコンピューターにプロセスが割り当てられています。

例20.13 サーバーの応答例 (XStream)

<org.kie.server.api.model.ServiceResponse>
  <type>SUCCESS</type>
  <msg>Best computed solution for 'solver1' successfully retrieved from container 'optacloud-kiecontainer-1'</msg>
   <result class="solver-instance">
    <container-id>optacloud-kiecontainer-1</container-id>
    <solver-id>solver1</solver-id>
    <solver-config-file>opta/optacloud/cloudSolverConfig.solver.xml</solver-config-file>
    <status>SOLVING</status>
    <score class="org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore">
      <hardScore>0</hardScore>
      <softScore>-3000</softScore>
    </score>
    <best-solution class="opta.optacloud.CloudSolution">
      <score class="org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore" reference="../../score" />
      <computerList>
        <opta.optacloud.Computer>
          <cpuPower>10</cpuPower>
          <memory>4</memory>
          <networkBandwidth>100</networkBandwidth>
          <cost>1000</cost>
        </opta.optacloud.Computer>
        <opta.optacloud.Computer>
          <cpuPower>20</cpuPower>
          <memory>8</memory>
          <networkBandwidth>100</networkBandwidth>
          <cost>3000</cost>
        </opta.optacloud.Computer>
      </computerList>
      <processList>
        <opta.optacloud.Process>
          <requiredCpuPower>1</requiredCpuPower>
          <requiredMemory>7</requiredMemory>
          <requiredNetworkBandwidth>1</requiredNetworkBandwidth>
          <computer reference="../../../computerList/opta.optacloud.Computer[2]" />
        </opta.optacloud.Process>
      </processList>
    </best-solution>
  </result>
</org.kie.server.api.model.ServiceResponse>

20.2.7. [DELETE] /containers/{containerId}/solvers/{solverId}

コンテナー {containerId} の Solver {solverId} を破棄します。Solver が終了していない場合は、終了してから行います。

例20.14 サーバーの応答例 (XStream)

<org.kie.server.api.model.ServiceResponse>
  <type>SUCCESS</type>
  <msg>Solver 'solver1' successfully disposed from container 'optacloud-kiecontainer-1'</msg>
</org.kie.server.api.model.ServiceResponse>

例20.15 サーバーの応答例 (JSON)

{
  "type" : "SUCCESS",
  "msg" : "Solver 'solver1' successfully disposed from container 'optacloud-kiecontainer-1'"
}