第4章 DMN モデルの呼び出しオプション


DMN ファイルに定義したデシジョンを呼び出すには、最初にファイルを KIE コンテナーにパッケージ化する必要があります。ナレッジコンポーネントの特定のバージョンは、リモートアクセス用に Decision Server にデプロイするか、呼び出しアプリケーションの依存関係として直接操作できます。このドキュメントでは、このナレッジパッケージを作成およびデプロイするためのオプションをすべて説明しているわけではありませんが、多くの場合は (Drools ルールファイルまたは jBPM プロセス定義などの) その他のアセットに類似します。デシジョンをパッケージ化するか、デプロイしてから、それを呼び出すオプションはいくつかあります。

4.1. DMN コールを Java アプリケーションに直接組み込み

KIE コンテナーは、ナレッジアセットを呼び出しプログラムに直接組み込む際、または KJAR 用 Maven 依存関係を使用して物理的にプルする際にローカルになります。コードのバージョンと、DMN 定義のバージョンとの間に密接な関係がある場合に、ナレッジアセットをプロジェクトに直接組み込む必要があります。意思決定への変更は、アプリケーションをアップデートして再デプロイしないと有効になりません。このアプローチに対する潜在的な利点の 1 つは、適切なオペレーションがランタイムへの外部の依存関係に依存しておらず、ロックされた環境への制限になるということです。

Maven の依存関係を使用すると、システムプロパティーを使用して、アップデートを定期的にスキャンして自動的にアップデートするなど、特定バージョンの意思決定が動的に変更するため、柔軟性が高まります。これにより、外部の依存関係がサービスのデプロイ時間に影響を及ぼしますが、意思決定はローカルで実行されるため、ランタイム時に利用可能な外部サービスに対する信頼が低くなります。

前提条件

  • 実行する DMN モデルを含む KJAR が作成されている。
  • 以下の依存関係が、プロジェクトの pom.xml ファイルに追加されている。
<!-- Required for the DMN runtime API -->
<dependency>
  <groupId>org.kie</groupId>
  <artifactId>kie-dmn-core</artifactId>
  <version>${drools-version}</version>
</dependency>

<!-- Required if not using classpath kie container -->
<dependency>
  <groupId>org.kie</groupId>
  <artifactId>kie-ci</artifactId>
  <version>${drools-version}</version>
</dependency>
Copy to Clipboard
注記

${drools-version} は Maven プロパティーで、ランタイム時に、その他の KIE / Drools 依存関係に使用されている正確なバージョンを決定する必要があります。

手順

  1. classpath または ReleaseId から KIE コンテナーを作成します。

    KieServices kieServices = KieServices.Factory.get();
    
    ReleaseId releaseId = kieServices.newReleaseId( "org.acme", "my-kjar", "1.0.0" );
    KieContainer kieContainer = kieServices.newKieContainer( releaseId );
    Copy to Clipboard

    または、以下のオプションを使用します。

    KieServices kieServices = KieServices.Factory.get();
    
    KieContainer kieContainer = kieServices.getKieClasspathContainer();
    Copy to Clipboard
  2. namespace モデルおよび modelName モデルを使用して、KIE コンテナーの DMNRuntime と、評価する DMN モデルへの参照を取得します。

    DMNRuntime dmnRuntime = kieContainer.newKieSession().getKieRuntime(DMNRuntime.class);
    
    String namespace = "http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a";
    String modelName = "dmn-movieticket-ageclassification";
    
    DMNModel dmnModel = dmnRuntime.getModel(namespace, modelName);
    Copy to Clipboard
  3. 希望するモデルに対してデシジョンサービスを実行します。

    DMNContext dmnContext = dmnRuntime.newContext();  
    1
    
    
    for (Integer age : Arrays.asList(1,12,13,64,65,66)) {
      dmnContext.set("Age", age);  
    2
    
      DMNResult dmnResult = dmnRuntime.evaluateAll(dmnModel, dmnContext);  
    3
    
      for (DMNDecisionResult dr : dmnResult.getDecisionResults()) {  
    4
    
        log.info("Age " + age + " Decision '" + dr.getDecisionName() + "' : " + dr.getResult());
      }
    }
    Copy to Clipboard
    1
    モデル評価に対する入力として使用する、新しい DMN コンテキストをインスタンス化します。この例では、Age Classification の意思決定を複数回ループさせています。
    2
    入力の DMN コンテキストに入力変数を割り当てます。
    3
    DMN モデルに定義した DMN デシジョンをすべて評価します。
    4
    1 回の評価で結果が 1 つ以上になることがあり、ループを作成します。

    この例では、以下の結果を出力します。

    Age 1 Decision 'AgeClassification' : Child
    Age 12 Decision 'AgeClassification' : Child
    Age 13 Decision 'AgeClassification' : Adult
    Age 64 Decision 'AgeClassification' : Adult
    Age 65 Decision 'AgeClassification' : Senior
    Age 66 Decision 'AgeClassification' : Senior
    Copy to Clipboard

4.2. Decision Server (Java) で DMN サービスをリモートに実行

KIE のリモート API クライアントは、Decision Server の REST または JMS インターフェースを通してリモートの DMN サービスを呼び出す軽量なアプローチを提供します。これにより、ナレッジベースと相互に作用するのに必要なランタイムの依存関係の数が減ります。これを有効にして適切なペースで個別に相互作用するようにし、意思決定の定義から呼び出しコードを切り離すと、柔軟性が上がります。

前提条件

  • Decision Server がインストールされ設定されている (kie-server ロールを持つユーザーの、既知のユーザー名と認証情報を含む)。
  • KIE コンテナーが、DMN モデルを含む KJAR の形式で、Decision Server でデプロイされている。
  • KIE コンテナーのコンテナー ID にDMN モデルを含んでいる。1 つ以上のモデルが存在する場合は、そのモデルの名前空間およびモデル名が必要です。
  • 以下の依存関係が、プロジェクトの pom.xml ファイルに追加されている。
<dependency>
  <groupId>org.kie.server</groupId>
  <artifactId>kie-server-client</artifactId>
  <version>${drools-version}</version>
</dependency>
Copy to Clipboard
注記

${drools-version} は Maven プロパティーで、ランタイム時に、その他の KIE / Drools 依存関係に使用されている正確なバージョンを決定する必要があります。

手順

  1. 適切な接続情報で KieServicesClient インスタンスをインスタンス化します。

    例:

    KieServicesConfiguration conf =
        KieServicesFactory.newRestConfiguration(URL, USER, PASSWORD); 
    1
    
    
    conf.setMarshallingFormat(MarshallingFormat.JSON);  
    2
    
    
    KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(conf);
    Copy to Clipboard
    1
    接続情報:
    2
    マーシャリングの形式は、org.kie.server.api.marshalling.MarshallingFormat のインスタンスです。これは、メッセージが JSON であるか XML であるかを制御します。マーシャリング形式のオプションは、JSON、JAXB、 XSTREAM です。
  2. KIE サーバーの Java クライアントインスタンスで getServicesClient() メソッドを呼び出すことで、関連する Decision Server に接続した KIE サーバーの Java クライアントから DMNServicesClient を取得します。

    DMNServicesClient dmnClient = kieServicesClient.getServicesClient(DMNServicesClient.class );
    Copy to Clipboard

    これで、dmnClient が、Decision Server でデシジョンサービスを実行できるようになりました。

  3. 希望するモデルに対してデシジョンサービスを実行します。

    例:

    for (Integer age : Arrays.asList(1,12,13,64,65,66)) {
    	DMNContext dmnContext = dmnClient.newContext(); 
    1
    
    	dmnContext.set("Age", age);       
    2
    
    	ServiceResponse<DMNResult> serverResp =           
    3
    
    			dmnClient.evaluateAll($kieContainerId,
    					$modelNamespace,
    					$modelName,
    					dmnContext);
    
    	DMNResult dmnResult = serverResp.getResult();   
    4
    
    	for (DMNDecisionResult dr : dmnResult.getDecisionResults()) {
    		log.info("Age " + age + " Decision '" + dr.getDecisionName() + "' : " + dr.getResult());
    	}
    }
    Copy to Clipboard
    1
    モデル評価に対する入力として使用する、新しい DMN コンテキストをインスタンス化します。この例では、Age Classification の意思決定を複数回ループさせています。
    2
    入力 DMN コンテキストに入力変数を割り当てます。
    3
    DMN モデルに定義したすべての DMN の意思決定を評価しま す。
    • $kieContainerId は、DMN モデルを含む KJAR がデプロイされているコンテナーの ID です。
    • $modelNamespace は、モデルの名前空間です。
    • $modelName は、モデルの名前です。
    4
    DMN の結果オブジェクトは、サーバーの応答から利用できます。

    この時点では、dmnResult には、評価した DMN モデルから得た意思決定の結果がすべて含まれます。

    注記

    DMNServicesClient で利用可能なメソッドを使用して、モデルで特定の DMN 意思決定だけを実行することもできます。

    ヒント

    KIE コンテナーに DMN モデルが 1 つだけ含まれる場合は、KIE API によってデフォルトで選択されるため、$modelNamespace$modelName を除外できます。

4.3. REST API を使用してリモートサーバーで DMN サービスの呼び出し

Decision Server の REST エンドポイントで直接対話することで、呼び出しコードと、意思決定ロジックの定義の分離が最大になります。呼び出しコードに直接の依存関係がないため、node.js.net など、完全に異なる開発プラットフォームに実装できます。このセクションの例では、Nix スタイルの curl コマンドを示しますが、REST クライアントに適用するための関連情報を提供します。

前提条件

  • Decision Server がインストールされ、設定されている (サービスユーザーアカウントのアクセスが許可されている)。
  • KIE コンテナーが、DMN モデルを含む KJAR の形式で、Decision Server でデプロイされている。
  • KIE コンテナーのコンテナー ID にDMN モデルを含んでいる。1 つ以上のモデルが存在する場合は、そのモデルの名前空間およびモデル名が必要です。

手順

  1. REST エンドポイントにアクセスするためのベース URL を決定します。これには、以下の値が必要です (例ではローカルのデプロイメント値を使用しています)。

    • ホスト (localhost)
    • ポート (8080)
    • ルートコンテキスト (kie-server)
    • ベース REST パス (services/rest/server)

    ローカルデプロイメントのサンプル URL:

    http://localhost:8080/kie-server/services/rest/server
    Copy to Clipboard
  2. ユーザー認証要件を決定します。

    ユーザーを Decision Server 設定に直接定義すると、ユーザー名およびパスワードを要求する BasicAuth が使用されます。要求を成功させるには、ユーザーに kie-server ルールが必要です。

    以下の例は、curl 要求に認証情報を追加する方法を示します。

    curl -u username:password <request>
    Copy to Clipboard

    Red Hat シングルサインオンを使用して Decision Server を設定している場合は、要求にベアラートークンが必要です。

    curl -H "Authorization: bearer $TOKEN" <request>
    Copy to Clipboard
  3. 要求と応答の形式を指定します。REST エンドポイントには JSON と XML の両方の書式が利用でき、要求ヘッダーを使用して設定されます。

    JSON

    curl -H "accept: application/json" -H "content-type: application/json"
    Copy to Clipboard

    XML

    curl -H "accept: application/xml" -H "content-type: application/xml"
    Copy to Clipboard

  4. (任意) デプロイしたデシジョンモデルのリストに対するコンテナーのクエリーです。

    [GET] /containers/CONTAINER_ID/dmn

    curl 要求例:

    curl -u krisv:krisv -H "accept: application/xml" -X GET "http://localhost:8080/kie-server/services/rest/server/containers/MovieDMNContainer/dmn"
    Copy to Clipboard

    サンプルの XML 出力:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <response type="SUCCESS" msg="OK models successfully retrieved from container 'MovieDMNContainer'">
        <dmn-model-info-list>
            <model>
                <model-namespace>http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a</model-namespace>
                <model-name>dmn-movieticket-ageclassification</model-name>
                <model-id>_99</model-id>
                <decisions>
                    <dmn-decision-info>
                        <decision-id>_3</decision-id>
                        <decision-name>AgeClassification</decision-name>
                    </dmn-decision-info>
                </decisions>
            </model>
        </dmn-model-info-list>
    </response>
    Copy to Clipboard

    サンプルの JSON 出力:

    {
      "type" : "SUCCESS",
      "msg" : "OK models successfully retrieved from container 'MovieDMNContainer'",
      "result" : {
        "dmn-model-info-list" : {
          "models" : [ {
            "model-namespace" : "http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a",
            "model-name" : "dmn-movieticket-ageclassification",
            "model-id" : "_99",
            "decisions" : [ {
              "decision-id" : "_3",
              "decision-name" : "AgeClassification"
            } ]
          } ]
        }
      }
    }
    Copy to Clipboard
  5. モデルを実行します。

    [POST] /containers/CONTAINER_ID/dmn

    curl 要求例:

    curl -u krisv:krisv -H "accept: application/json" -H "content-type: application/json" -X POST "http://localhost:8080/kie-server/services/rest/server/containers/MovieDMNContainer/dmn" -d "{ \"model-namespace\" : \"http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a\", \"model-name\" : \"dmn-movieticket-ageclassification\", \"decision-name\" : [ ], \"decision-id\" : [ ], \"dmn-context\" : {\"Age\" : 66}}"
    Copy to Clipboard

    JSON 要求例:

    {
      "model-namespace" : "http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a",
      "model-name" : "dmn-movieticket-ageclassification",
      "decision-name" : [ ],
      "decision-id" : [ ],
      "dmn-context" : {"Age" : 66}
    }
    Copy to Clipboard

    XML 要求例 (JAXB スタイル):

    <?xml version="1.0" encoding="UTF-8"?>
    <dmn-evaluation-context>
        <model-namespace>http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a</model-namespace>
        <model-name>dmn-movieticket-ageclassification</model-name>
        <dmn-context xsi:type="jaxbListWrapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <type>MAP</type>
            <element xsi:type="jaxbStringObjectPair" key="Age">
                <value xsi:type="xs:int" xmlns:xs="http://www.w3.org/2001/XMLSchema">66</value>
            </element>
        </dmn-context>
    </dmn-evaluation-context>
    Copy to Clipboard
    注記

    要求には、その形式にかかわらず、以下の要素が必要です。

    • モデルの名前空間
    • モデル名
    • 入力値を含むコンテキストオブジェクト

    JSON 応答例:

    {
      "type" : "SUCCESS",
      "msg" : "OK from container 'MovieDMNContainer'",
      "result" : {
        "dmn-evaluation-result" : {
          "messages" : [ ],
          "model-namespace" : "http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a",
          "model-name" : "dmn-movieticket-ageclassification",
          "decision-name" : [ ],
          "dmn-context" : {
            "Age" : 66,
            "AgeClassification" : "Senior"
          },
          "decision-results" : {
            "_3" : {
              "messages" : [ ],
              "decision-id" : "_3",
              "decision-name" : "AgeClassification",
              "result" : "Senior",
              "status" : "SUCCEEDED"
            }
          }
        }
      }
    }
    Copy to Clipboard

    XML (JAXB 形式) 応答例:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <response type="SUCCESS" msg="OK from container 'MovieDMNContainer'">
          <dmn-evaluation-result>
                <model-namespace>http://www.redhat.com/_c7328033-c355-43cd-b616-0aceef80e52a</model-namespace>
                <model-name>dmn-movieticket-ageclassification</model-name>
                <dmn-context xsi:type="jaxbListWrapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                      <type>MAP</type>
                      <element xsi:type="jaxbStringObjectPair" key="Age">
                            <value xsi:type="xs:int" xmlns:xs="http://www.w3.org/2001/XMLSchema">66</value>
                      </element>
                      <element xsi:type="jaxbStringObjectPair" key="AgeClassification">
                            <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema">Senior</value>
                      </element>
                </dmn-context>
                <messages/>
                <decisionResults>
                      <entry>
                            <key>_3</key>
                            <value>
                                  <decision-id>_3</decision-id>
                                  <decision-name>AgeClassification</decision-name>
                                  <result xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Senior</result>
                                  <messages/>
                                  <status>SUCCEEDED</status>
                            </value>
                      </entry>
                </decisionResults>
          </dmn-evaluation-result>
    </response>
    Copy to Clipboard
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat