19.3. ローン申し込みプロジェクトの例
以下のセクションでは、ローン申請プロジェクトを例として使用し、DRL プロジェクトを Red Hat build of Kogito デプロイメントに移行します。ローン申し込みプロジェクトのドメインモデルは、LoanApplication クラスと Applicant クラスの 2 つのクラスで構成されています。
LoanApplication クラスの例
Applicant クラスの例
ルールセットは、ビジネスデシジョンを使用してアプリケーションを承認または拒否し、承認済みの全アプリケーションをリストで収集する最後のルールと共に作成されます。
ローン申し込みのルールセットの例
19.3.1. Red Hat build of Quarkus を使用した REST エンドポイントでのルール評価の公開 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat build of Quarkus を使用して、REST エンドポイントで Business Central で開発したルール評価を公開できます。
手順
ルールおよび Quarkus ライブラリーが含まれるモジュールに基づいて新しいモジュールを作成し、REST サポートを提供します。
新しいモジュールを作成する依存関係の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow REST エンドポイントを作成します。
以下は、REST エンドポイントを作成する設定例です。
FindApprovedLoansEndpointエンドポイントの設定例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の例では、ルールを含む
KieContainerが作成され、静的フィールドに追加されます。KieContainerのルールは、クラスパス内の他のモジュールから取得されます。この方法では、ルールを再コンパイルせずにFindApprovedLoansEndpointエンドポイントに関連する後続の呼び出しで同じKieContainerを再利用できます。注記この 2 つのモジュールは、レガシー API を使用してルールユニットを Red Hat build of Kogito マイクロサービスに移行する次のプロセスで統合されます。詳細は、Migrating DRL rules units to Red Hat build of Kogito microservice using legacy API を参照してください。
FindApprovedLoansEndpointエンドポイントが呼び出されると、KieContainerから新しいKieSessionが作成されます。KieSessionには、LoanAppDtoのオブジェクトが入力され、JSON リクエストのアンマーシャリングになります。LoanAppDtoクラスの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow fireAllRules()メソッドが呼び出されると、KieSessionが実行され、ビジネスロジックが入力データに対して評価されます。ビジネスロジックの評価後、最後のルールはリストで承認されたアプリケーションをすべて収集し、出力と同じリストを返します。- Red Hat build of Quarkus アプリケーションを起動します。
確認するローンアプリケーションが含まれる JSON 要求で
FindApprovedLoansEndpointエンドポイントを呼び出します。maxAmountの値は、以下の例のようにルールで使用されます。curl 要求例
curl -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -d '{"maxAmount":5000, "loanApplications":[ {"id":"ABC10001","amount":2000,"deposit":1000,"applicant":{"age":45,"name":"John"}}, {"id":"ABC10002","amount":5000,"deposit":100,"applicant":{"age":25,"name":"Paul"}}, {"id":"ABC10015","amount":1000,"deposit":100,"applicant":{"age":12,"name":"George"}} ]}' http://localhost:8080/find-approvedcurl -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -d '{"maxAmount":5000, "loanApplications":[ {"id":"ABC10001","amount":2000,"deposit":1000,"applicant":{"age":45,"name":"John"}}, {"id":"ABC10002","amount":5000,"deposit":100,"applicant":{"age":25,"name":"Paul"}}, {"id":"ABC10015","amount":1000,"deposit":100,"applicant":{"age":12,"name":"George"}} ]}' http://localhost:8080/find-approvedCopy to Clipboard Copied! Toggle word wrap Toggle overflow JSON の応答例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
この方法では、ホットリロード機能を使用できないため、プロジェクトのネイティブイメージを作成できません。次の手順では、欠落していた Quarkus 機能は Kogito エクステンションによって提供されます。これにより、Quarkus は DRL ファイルを認識し、ホットリロード機能を同様の方法で実装します。
19.3.2. レガシー API を使用した Red Hat build of Kogito マイクロサービスへのルール評価の移行 リンクのコピーリンクがクリップボードにコピーされました!
REST エンドポイントでルール評価を公開したら、レガシー API を使用してルール評価を Red Hat build of Kogito マイクロサービスに移行できます。
手順
プロジェクトの
pom.xmlファイルに以下の依存関係を追加して、Red Hat build of Quarkus およびレガシー API を使用できるようにします。Quarkus およびレガシー API を使用する依存関係の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow REST エンドポイント実装を書き換えます。
REST エンドポイント実装の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 書き換えられた REST エンドポイント実装では、
KieContainerからKieSessionを作成する代わりに、統合KieRuntimeBuilderを使用してKieSessionが自動的に作成されます。KieRuntimeBuilderは、KieContainerに代わるkogito-legacy-apiモジュールが提供するインターフェイスです 。KieRuntimeBuilderを使用すると、KieContainerで同様の方法でKieBaseとKieSessionを作成できます 。Red Hat build of Kogito はコンパイル時にKieRuntimeBuilderインターフェイスの実装を自動的に生成し、KieRuntimeBuilderをクラスに統合してFindApprovedLoansEndpointREST エンドポイントを実装します。開発モードで Red Hat build of Quarkus アプリケーションを起動します。
ホットリロードを使用して、実行中のアプリケーションに適用されるルールファイルに変更を加えることもできます。また、ルールベースのアプリケーションのネイティブイメージを作成することもできます。
19.3.3. ルールユニットおよび自動 REST エンドポイント生成の実装 リンクのコピーリンクがクリップボードにコピーされました!
ルールユニットを Red Hat build of Kogito マイクロサービスに移行したら、REST エンドポイントのルールユニットおよび自動生成を実装できます。
Red Hat build of Kogito では、ルールユニットに一連のルールとファクトが含まれ、ルールが一致します。Red Hat build of Kogito のルールユニットにはデータソースも含まれます。ルールユニットデータソースは、指定のルールユニットで処理されるデータのソースで、ルールユニットの評価に使用されるエントリーポイントを表します。ルールユニットは、2 種類のデータソースを使用します。
-
DataStream: これは、追加のみのデータソースです。DataStreamでは、サブスクライバーは新しいメッセージおよび過去のメッセージを受信すると、ストリームはリアクティブストリームでホットまたはコールドにすることができます。また、DataStreamに追加されたファクトは更新または削除できません。 -
DataStore: このデータソースは変更可能なデータ用です。オブジェクトがDataStoreに追加されるときに返されるFactHandleを使用して、オブジェクトを更新または削除できます。
全体的に、ルールユニットには、評価するファクトの定義と、ファクトを評価する一連のルールが含まれます。
手順
POJO を使用してファクト定義を実装します。
POJO を使用したファクト定義の実装例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の例では、
LoanAppDtoを使用してLoanUnitクラスを直接バインドします。LoanAppDtoは、JSON リクエストをマーシャリングまたはアンマーシャリングするために使用されます。また、上記の例では、org.kie.kogito.rules.RuleUnitDataインターフェイスを実装し、DataStoreを使用して承認するローンアプリケーションを追加します。org.kie.kogito.rules.RuleUnitDataはマーカーインターフェイスで、LoanUnitクラスがルールユニット定義の一部であることをデシジョンエンジンに通知します。さらに、DataStoreは、新しいルールを実行し、他のルールをトリガーして、ルールエンジンが変更に対応できるようにします。また、ルールの結果は、前の例で
approvedプロパティーを変更します。その間、maxAmountの値はルールユニットの設定パラメーターとして考慮され、これは変更されません。maxAmountは、ルールの評価時に自動的に処理され、JSON リクエストに渡される値から自動的に設定されます。DRL ファイルを実装します。
DRL ファイルの実装例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 作成する DRL ファイルは、ファクト定義実装と同じパッケージと、Java クラスの同じ名前を持つユニットを宣言する必要があります。Java クラスは、インターフェイスが同じルールユニットに属する状態に
RuleUnitDataインターフェイスを実装します。また、前述の例の DRL ファイルは OOPath 式を使用して書き換えられます。DRL ファイルのデータソースはエントリーポイントとして機能し、OOPath 式には root としてデータソース名が含まれます。ただし、制約は以下のように角括弧に追加されます。
$l: /loanApplications[ applicant.age >= 20, deposit >= 1000, amount ⇐ maxAmount ]または、標準の DRL 構文を使用できます。この構文では、データソース名をエントリーポイントとして指定することができます。ただし、以下の例のように、デシジョンエンジンがデータソースからタイプを推測できる場合でも、一致するオブジェクトのタイプを再度指定する必要があります。
$l: LoanApplication( applicant.age >= 20, deposit >= 1000, amount ⇐ maxAmount ) from entry-point loanApplications上記の例では、承認されたローンアプリケーションをすべて収集する最後のルールは、リストを取得するクエリーに置き換えられます。ルールユニットは、ルールを評価するために入力で渡されるファクトを定義し、クエリーはルール評価からの予想される出力を定義します。この方法では、Red Hat build of Kogito はクエリーを実行し、以下の例のように出力を返すクラスを自動的に生成できます。
LoanUnitQueryFindApprovedクラスの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下は、ルールユニットを入力として取り、入力をクエリーエグゼキューターに渡して出力を返す REST エンドポイントの例になります。
LoanUnitQueryFindApprovedEndpointエンドポイントの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記複数のクエリーを追加でき、クエリーごとに異なる REST エンドポイントが生成されます。たとえば、
FindApprovedREST エンドポイントが find-approved 用に生成されます。