第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>
<!-- 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>
${drools-version} は Maven プロパティーで、ランタイム時に、その他の KIE / Drools 依存関係に使用されている正確なバージョンを決定する必要があります。
手順
classpath
またはReleaseId
から KIE コンテナーを作成します。KieServices kieServices = KieServices.Factory.get(); ReleaseId releaseId = kieServices.newReleaseId( "org.acme", "my-kjar", "1.0.0" ); KieContainer kieContainer = kieServices.newKieContainer( releaseId );
KieServices kieServices = KieServices.Factory.get(); ReleaseId releaseId = kieServices.newReleaseId( "org.acme", "my-kjar", "1.0.0" ); KieContainer kieContainer = kieServices.newKieContainer( releaseId );
Copy to Clipboard Copied! または、以下のオプションを使用します。
KieServices kieServices = KieServices.Factory.get(); KieContainer kieContainer = kieServices.getKieClasspathContainer();
KieServices kieServices = KieServices.Factory.get(); KieContainer kieContainer = kieServices.getKieClasspathContainer();
Copy to Clipboard Copied! 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);
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 Copied! 希望するモデルに対してデシジョンサービスを実行します。
DMNContext dmnContext = dmnRuntime.newContext(); for (Integer age : Arrays.asList(1,12,13,64,65,66)) { dmnContext.set("Age", age); DMNResult dmnResult = dmnRuntime.evaluateAll(dmnModel, dmnContext); for (DMNDecisionResult dr : dmnResult.getDecisionResults()) { log.info("Age " + age + " Decision '" + dr.getDecisionName() + "' : " + dr.getResult()); } }
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 Copied! この例では、以下の結果を出力します。
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
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 Copied!
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>
<dependency>
<groupId>org.kie.server</groupId>
<artifactId>kie-server-client</artifactId>
<version>${drools-version}</version>
</dependency>
${drools-version} は Maven プロパティーで、ランタイム時に、その他の KIE / Drools 依存関係に使用されている正確なバージョンを決定する必要があります。
手順
適切な接続情報で
KieServicesClient
インスタンスをインスタンス化します。例:
KieServicesConfiguration conf = KieServicesFactory.newRestConfiguration(URL, USER, PASSWORD); conf.setMarshallingFormat(MarshallingFormat.JSON); KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(conf);
KieServicesConfiguration conf = KieServicesFactory.newRestConfiguration(URL, USER, PASSWORD);
1 conf.setMarshallingFormat(MarshallingFormat.JSON);
2 KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(conf);
Copy to Clipboard Copied! - 1
- 接続情報:
- サンプル URL: http://localhost:8080/kie-server/services/rest/server
-
この認証情報は、
kie-server
ロールを持つユーザーを参照します。
- 2
- マーシャリングの形式は、
org.kie.server.api.marshalling.MarshallingFormat
のインスタンスです。これは、メッセージが JSON であるか XML であるかを制御します。マーシャリング形式のオプションは、JSON、JAXB、 XSTREAM です。
KIE サーバーの Java クライアントインスタンスで
getServicesClient()
メソッドを呼び出すことで、関連する Decision Server に接続した KIE サーバーの Java クライアントからDMNServicesClient
を取得します。DMNServicesClient dmnClient = kieServicesClient.getServicesClient(DMNServicesClient.class );
DMNServicesClient dmnClient = kieServicesClient.getServicesClient(DMNServicesClient.class );
Copy to Clipboard Copied! これで、
dmnClient
が、Decision Server でデシジョンサービスを実行できるようになりました。希望するモデルに対してデシジョンサービスを実行します。
例:
for (Integer age : Arrays.asList(1,12,13,64,65,66)) { DMNContext dmnContext = dmnClient.newContext(); dmnContext.set("Age", age); ServiceResponse<DMNResult> serverResp = dmnClient.evaluateAll($kieContainerId, $modelNamespace, $modelName, dmnContext); DMNResult dmnResult = serverResp.getResult(); for (DMNDecisionResult dr : dmnResult.getDecisionResults()) { log.info("Age " + age + " Decision '" + dr.getDecisionName() + "' : " + dr.getResult()); } }
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 Copied! - 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 つ以上のモデルが存在する場合は、そのモデルの名前空間およびモデル名が必要です。
手順
REST エンドポイントにアクセスするためのベース URL を決定します。これには、以下の値が必要です (例ではローカルのデプロイメント値を使用しています)。
-
ホスト (
localhost
) -
ポート (
8080
) -
ルートコンテキスト (
kie-server
) -
ベース REST パス (
services/rest/server
)
ローカルデプロイメントのサンプル URL:
http://localhost:8080/kie-server/services/rest/server
http://localhost:8080/kie-server/services/rest/server
Copy to Clipboard Copied! -
ホスト (
ユーザー認証要件を決定します。
ユーザーを Decision Server 設定に直接定義すると、ユーザー名およびパスワードを要求する BasicAuth が使用されます。要求を成功させるには、ユーザーに
kie-server
ルールが必要です。以下の例は、curl 要求に認証情報を追加する方法を示します。
curl -u username:password <request>
curl -u username:password <request>
Copy to Clipboard Copied! Red Hat シングルサインオンを使用して Decision Server を設定している場合は、要求にベアラートークンが必要です。
curl -H "Authorization: bearer $TOKEN" <request>
curl -H "Authorization: bearer $TOKEN" <request>
Copy to Clipboard Copied! 要求と応答の形式を指定します。REST エンドポイントには JSON と XML の両方の書式が利用でき、要求ヘッダーを使用して設定されます。
JSON
curl -H "accept: application/json" -H "content-type: application/json"
curl -H "accept: application/json" -H "content-type: application/json"
Copy to Clipboard Copied! XML
curl -H "accept: application/xml" -H "content-type: application/xml"
curl -H "accept: application/xml" -H "content-type: application/xml"
Copy to Clipboard Copied! (任意) デプロイしたデシジョンモデルのリストに対するコンテナーのクエリーです。
[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"
curl -u krisv:krisv -H "accept: application/xml" -X GET "http://localhost:8080/kie-server/services/rest/server/containers/MovieDMNContainer/dmn"
Copy to Clipboard Copied! サンプルの 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>
<?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 Copied! サンプルの 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" } ] } ] } } }
{ "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 Copied! モデルを実行します。
[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}}"
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 Copied! 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} }
{ "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 Copied! 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>
<?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 Copied! 注記要求には、その形式にかかわらず、以下の要素が必要です。
- モデルの名前空間
- モデル名
- 入力値を含むコンテキストオブジェクト
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" } } } } }
{ "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 Copied! 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>
<?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 Copied!