The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

アプリケーションにディシジョン・オートメーション機能を追加するための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.1+

  • 動作するコンテナランタイム(Docker, Podman)

  • 使用したい場合、 Quarkus CLI

  • ネイティブ実行可能ファイルをビルドしたい場合、MandrelまたはGraalVM(あるいはネイティブなコンテナビルドを使用する場合はDocker)をインストールし、 適切に設定していること

DMNエディター

Kogito Toolingは現在、VSCode、Webブラウザ、その他のプラットフォームでサポートされています:

VSCode

VSCode IDE からプロセス定義を編集およびモデル化するために、 Red Hat BPMN エディタVSCodeエクステンション をダウンロードしてインストールします。

オンライン

モデラーのインストールをしなくても、お気に入りの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 、または archive をダウンロードする。

ソリューションは kogito-dmn-quickstart directory にあります。

Mavenプロジェクトの作成

まず、新しいプロジェクトを用意します。以下のコマンドで新しいプロジェクトを作成します:

CLI
quarkus create app org.acme:kogito-dmn-quickstart \
    --extension=dmn,resteasy-reactive-jackson \
    --no-code
cd kogito-dmn-quickstart

Gradleプロジェクトを作成するには、 --gradle または --gradle-kotlin-dsl オプションを追加します。

Quarkus CLIのインストール方法については、Quarkus CLIガイドをご参照ください。

Maven
mvn io.quarkus.platform:quarkus-maven-plugin:2.11.1.Final:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=kogito-dmn-quickstart \
    -Dextensions="dmn,resteasy-reactive-jackson" \
    -DnoCode
cd kogito-dmn-quickstart

Gradleプロジェクトを作成するには、 -DbuildTool=gradle または -DbuildTool=gradle-kotlin-dsl オプションを追加します。

このコマンドはMavenプロジェクトを生成し、アプリケーションにビジネス・オートメーションの機能を追加するために必要な依存関係と構成をすべて備えた kogito-quarkus-decisions エクステンションをインポートします。また、KogitoがRESTサービスを公開するのに必要な resteasy-jackson エクステンションをインポートします。

kogito-quarkus-decisions は、Kogitoプロジェクトの中でもDMNのサポートのみに特化したエクステンションです。Kogitoプラットフォームが提供する機能をすべて利用したい場合は、Quarkusの汎用Kogitoエクステンションを参照することができます。

すでにQuarkusプロジェクトが設定されている場合は、プロジェクトのベースディレクトリで以下のコマンドを実行することで、 kogito-quarkus-decisions エクステンションをプロジェクトに追加することができます:

CLI
quarkus extension add 'dmn'
Maven
./mvnw quarkus:add-extension -Dextensions="dmn"
Gradle
./gradlew addExtension --extensions="dmn"

またはその代わりに以下を実行してください:

CLI
quarkus extension add 'kogito-quarkus-decisions'
Maven
./mvnw quarkus:add-extension -Dextensions="kogito-quarkus-decisions"
Gradle
./gradlew addExtension --extensions="kogito-quarkus-decisions"

これにより、 pom.xml に以下が追加されます:

pom.xml
<dependency>
    <groupId>org.kie.kogito</groupId>
    <artifactId>kogito-quarkus-decisions</artifactId>
</dependency>
build.gradle
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 model definition

すぐに始めるには、DMNモデル定義ファイルを quickstart からコピーすることも出来ます。

Base price Decisionノードの意思決定ロジックは、以下のような DMN Decision Table とします:

DMN Decision Table definition

DMNモデルを自分で作成するには、以下の手順を実施下さい:

  • drag an InputData node from the palette, name it Age and assign it the type number using the Properties panel.

  • drag an InputData node from the palette, name it Previous incidents? and assign it the type boolean using the Properties panel.

  • drag a Decision node from the palette, name it Base price and assign it the type number using the Properties panel.

  • グラフ内の要素の近くにマウスオーバーしてノードパレットを使用し、Age ノードから Base price ノードへの InformationRequirement エッジを確立します。

  • グラフ内の要素の近くにマウスオーバーしてノードパレットを使用し、Previous incidents? ノードから Base price ノードへの 情報要件 を接続します。

  • Base price ノードの編集オプションを選択します。

    • ノードの意思決定ロジックとして Decision Table を選択します。

    • 上記のスクリーンショットのように、関連するルール(行)のエントリを作成します。

  • ファイルの保存

DMNの詳細については、ページ下部のリンクからKogitoのドキュメントを参照できます。

アプリケーションの実行と使用

Devモードでの動作

マイクロサービスをdevモードで実行するには:

CLI
quarkus dev
Maven
./mvnw quarkus:dev
Gradle
./gradlew --console=plain quarkusDev

JVMモードでの動作

「開発モード」で遊び終わったら、標準のJavaアプリケーションとして実行することができます。

まず、コンパイルします:

CLI
quarkus build
Maven
./mvnw clean package
Gradle
./gradlew build

それから実行してください:

java -jar target/quarkus-app/quarkus-run.jar

ネイティブモードでの実行

同じデモをネイティブコードにコンパイルすることができます。修正は必要ありません。

これは、生成されたバイナリにランタイム技術が含まれており、最小限のリソースオーバーヘッドで実行できるように最適化されているため、本番環境にJVMをインストールする必要がないことを意味します。

コンパイルには少し時間がかかるので、このステップはデフォルトでは無効になっています。以下のコマンドでネイティブ実行可能ファイルをビルドしてみましょう:

CLI
quarkus build --native
Maven
./mvnw package -Dnative
Gradle
./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アプリケーションの通常のビルドの一部として実行することができます。

テストシナリオアセットをアプリケーションで使用するためには、追加の依存関係が必要です:

pom.xml
<dependency>
    <groupId>org.kie.kogito</groupId>
    <artifactId>kogito-scenario-simulation</artifactId>
    <scope>test</scope>
</dependency>
build.gradle
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 ファイルを作成することができます:

DMN Test scenario

テストシナリオは、JUnitテストスイートの一部として実行されます。

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

今後の展開

これはDMNモデリングを使用した最小限の例です。Kogitoフレームワークでは、DMNのような視覚的で標準的な表記法を使用して決定論理をすばやく定義し、Quarkusの上に完全に機能するマイクロサービスを作成できることがおわかりいただけると思います!

Kogitoプラットフォームの追加機能を知るには、以下のリンクでKogitoのドキュメントを参照して下さい。これには、プロセス(BPMN2)、ルール(DroolsのDRL)、予測(PMML)、テストシナリオ(テストのための視覚的記法)、OpenShiftへのアシストデプロイメントなどとの統合に関するより詳細なガイドが含まれています。