アプリケーションにディシジョン・オートメーション機能を追加するためのKogito DMNサポートの使用
このガイドでは、QuarkusアプリケーションがKogitoを使用してビジネスオートメーションを追加し、DMN意思決定サポートでパワーアップする方法を説明します。
Kogitoは、よく知られたオープンソース・プロジェクトであるDrools(ビジネス・ルール用)とjBPM(ビジネス・プロセス用)から生まれた、次世代のビジネス・オートメーション・ツールキットです。Kogitoは、ビジネス・オートメーションに新しいアプローチを提供することを目的としており、主なメッセージは、ビジネス・ナレッジ(プロセス、ルール、決定、予測)をドメイン固有の方法で公開することです。
前提条件
このガイドを完成させるには、以下が必要です:
-
約15分
-
IDE (VSCode is preferred, with the Red Hat DMN Editor VSCode Extension)
-
JDK 11+ がインストールされ、
JAVA_HOMEが適切に設定されていること -
Apache Maven 3.8.6
-
動作するコンテナランタイム(Docker, Podman)
-
使用したい場合は、 Quarkus CLI
-
ネイティブ実行可能ファイルをビルドしたい場合、MandrelまたはGraalVM(あるいはネイティブなコンテナビルドを使用する場合はDocker)をインストールし、 適切に設定していること
DMNエディター
Kogito Toolingは現在、VSCode、Webブラウザ、その他のプラットフォームでサポートされています。
- VSCode
-
VSCode IDE からプロセス定義を編集およびモデル化するために、 Red Hat BPMN エディタVSCodeエクステンション をダウンロードしてインストールします。
- Online
-
モデラーのインストールをしなくても、お気に入りのWebブラウザからKIE Sandboxを直接使ってDMNモデルをオーサリングすることができます。
- その他のプラットフォーム
-
こちらの Kogito toolingリリース でサポートされている最新のプラットフォームをダウンロードすることができます。
アーキテクチャ
この例では、1つのRESTエンドポイントを提供する非常にシンプルなマイクロサービスを構築します。
-
/pricing
このエンドポイントは、定義されたDMNモデルに基づいて自動的に生成されます。
DMNモデルとしての意思決定ルール
DMNモデルは、宣言型ロジックを視覚的かつ意味的に実行するためのオープンスタンダードです。DMNを使用すると、意思決定ロジックを再利用可能なパーツに外部化することができ、宣言的な方法で簡単に使用することができます。DMN以外にも、デシジョンテーブル、デシジョンツリー、ルールなど、様々なルールの書き方があります。
この例では、オープンスタンダードの DMN(Decision Model and Notation)を使って意思決定ルールを記述することに焦点を当てています。
ソリューション
次の章で紹介する手順に沿って、ステップを踏んでアプリを作成することをお勧めします。ただし、完成した例にそのまま進んでも構いません。
Gitレポジトリをクローンするか git clone https://github.com/quarkusio/quarkus-quickstarts.git 、 アーカイブ をダウンロードします。
ソリューションは kogito-dmn-quickstart directory にあります。
Mavenプロジェクトの作成
まず、新しいプロジェクトが必要です。以下のコマンドで新規プロジェクトを作成します。
このコマンドはMavenプロジェクトを生成し、アプリケーションにビジネス・オートメーションの機能を追加するために必要な依存関係と構成をすべて備えた kogito-quarkus-decisions エクステンションをインポートします。また、KogitoがRESTサービスを公開するのに必要な resteasy-jackson エクステンションをインポートします。
kogito-quarkus-decisions は、Kogitoプロジェクトの中でもDMNのサポートのみに特化したエクステンションです。Kogitoプラットフォームが提供する機能をすべて利用したい場合は、Quarkusの汎用Kogitoエクステンションを参照することができます。
すでにQuarkusプロジェクトが設定されている場合は、プロジェクトのベースディレクトリで以下のコマンドを実行することで、 kogito-quarkus-decisions エクステンションをプロジェクトに追加することができます。
quarkus extension add 'dmn'
./mvnw quarkus:add-extension -Dextensions='dmn'
./gradlew addExtension --extensions='dmn'
またはその代わりに以下を実行してください。
quarkus extension add 'kogito-quarkus-decisions'
./mvnw quarkus:add-extension -Dextensions='kogito-quarkus-decisions'
./gradlew addExtension --extensions='kogito-quarkus-decisions'
これにより、 pom.xml に以下が追加されます:
<dependency>
<groupId>org.kie.kogito</groupId>
<artifactId>kogito-quarkus-decisions</artifactId>
</dependency>
implementation("org.kie.kogito:kogito-quarkus-decisions")
DMNモデルのオーサリング
いくつかの基準に基づいて基本的な価格の見積もりを提供するDMNモデルを作成します。生成されたプロジェクトの src/main/resources/ ディレクトリ内に、新しいファイル pricing.dmn を作成します。
このモデルは以下のように構成されているはずです:
-
Age(InputData要素 、number型) -
Previous incidents?(InputData要素 、boolean型) -
Base price(Decision要素 、number型)
そして、Decision Requirement Graph (DRG) は次のようになります:

すぐに始めるには、DMNモデル定義ファイルをhttps://github.com/quarkusio/quarkus-quickstarts/tree/2.16/kogito-quickstart/src/main/resources/pricing.dmn[quickstart]からコピーすることも出来ます。
Base price Decisionノードの意思決定ロジックは、以下のような DMN Decision Table とします:

DMNモデルを自分で作成するには、以下の手順を実施下さい。
-
パレットからInputDataノードをドラッグし、
Ageという名前を付け、プロパティパネルでnumberというタイプを割り当てます。 -
パレットからInputDataノードをドラッグし、
Previous incidents?という名前を付け、プロパティパネルでbooleanというタイプを割り当てます。 -
パレットからDecision ノードをドラッグし、
Base priceという名前を付け、プロパティパネルでnumberというタイプを割り当てます。 -
グラフ内の要素の近くにマウスオーバーしてノードパレットを使用し、
AgeノードからBase priceノードへのInformationRequirementエッジを確立します。 -
グラフ内の要素の近くにマウスオーバーしてノードパレットを使用し、
Previous incidents?ノードからBase priceノードへの情報要件を接続します。 -
Base priceノードの編集オプションを選択します。-
ノードの意思決定ロジックとして Decision Table を選択します。
-
上記のスクリーンショットのように、関連するルール(行)のエントリを作成します。
-
-
ファイルの保存
DMNの詳細については、ページ下部のリンクからKogitoのドキュメントを参照できます。
アプリケーションの実行と使用
開発モードでの実行
マイクロサービスをdevモードで実行するには:
quarkus dev
./mvnw quarkus:dev
./gradlew --console=plain quarkusDev
JVMモードでの動作
「開発モード」で遊び終わったら、標準のJavaアプリケーションとして実行することができます。
まずコンパイルします。
quarkus build
./mvnw install
./gradlew build
次に、以下を実行してください。
java -jar target/quarkus-app/quarkus-run.jar
ネイティブモードでの実行
同じデモをネイティブコードにコンパイルすることができます。
これは、生成されたバイナリーにランタイム技術が含まれており、最小限のリソースオーバーヘッドで実行できるように最適化されているため、本番環境にJVMをインストールする必要がないことを意味します。
コンパイルには少し時間がかかるので、このステップはデフォルトでは無効になっています。以下のコマンドでネイティブ実行可能ファイルをビルドしてみましょう。
quarkus build --native
./mvnw install -Dnative
./gradlew build -Dquarkus.package.type=native
ネイティブ・コンパイルにはどの場合も時間がかかりますが、その後、このバイナリを直接実行できるようになります:
./target/kogito-dmn-quickstart-1.0.0-SNAPSHOT-runner
アプリケーションのテスト
ディシジョンサービスアプリケーションをテストするには、JSONペイロードとして期待される入力を提供して、エンドポイントにリクエストを送るだけです。
curl -X POST 'http://localhost:8080/pricing' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{ "Age": 47, "Previous incidents?": false }'
レスポンスでは、定義されたDMNモデルに従って、 Base price は合計金額 500 と見積もられます。これはレスポンスのペイロードで確認できます:
{"Previous incidents?":false,"Age":47,"Base price":500}
テストシナリオツールの使用
Kogitoでは、視覚的にテストシナリオを定義し、それをJUnitテストとしてQuarkusアプリケーションの通常のビルドの一部として実行することができます。
テストシナリオアセットをアプリケーションで使用するためには、追加の依存関係が必要です:
<dependency>
<groupId>org.kie.kogito</groupId>
<artifactId>kogito-scenario-simulation</artifactId>
<scope>test</scope>
</dependency>
testImplementation("org.kie.kogito:kogito-scenario-simulation")
これで、 src/test/java/testscenario ディレクトリに KogitoScenarioJunitActivatorTest.java クラスファイルを作成することができます:
package testscenario;
@org.junit.runner.RunWith(org.kogito.scenariosimulation.runner.KogitoJunitActivator.class)
public class KogitoScenarioJunitActivatorTest {
}
このactivator クラスは、アプリケーション内でテスト・シナリオ・ファイルの実行を可能にするJUnitのカスタム・ランナーです。
これで、 src/test/resources ディレクトリに PricingTest.scesim ファイルを作成することができます:

テストシナリオは、JUnitテストスイートの一部として実行されます。
テスト・シナリオ・ツールの詳細については、ページ下部のリンクからKogitoのドキュメントを参照することができます。