19.3. ローン申し込みプロジェクトの例


以下のセクションでは、ローン申請プロジェクトを例として使用し、DRL プロジェクトを Red Hat build of Kogito デプロイメントに移行します。ローン申し込みプロジェクトのドメインモデルは、LoanApplication クラスと Applicant クラスの 2 つのクラスで構成されています。

LoanApplication クラスの例

public class LoanApplication {

   private String id;
   private Applicant applicant;
   private int amount;
   private int deposit;
   private boolean approved = false;

   public LoanApplication(String id, Applicant applicant,
                      	int amount, int deposit) {
   	this.id = id;
   	this.applicant = applicant;
   	this.amount = amount;
   	this.deposit = deposit;
   }
}
Copy to Clipboard Toggle word wrap

Applicant クラスの例

public class Applicant {

   private String name;
   private int age;

   public Applicant(String name, int age) {
   	this.name = name;
   	this.age = age;
   }
}
Copy to Clipboard Toggle word wrap

ルールセットは、ビジネスデシジョンを使用してアプリケーションを承認または拒否し、承認済みの全アプリケーションをリストで収集する最後のルールと共に作成されます。

ローン申し込みのルールセットの例

global Integer maxAmount;
global java.util.List approvedApplications;

rule LargeDepositApprove when
   $l: LoanApplication( applicant.age >= 20, deposit >= 1000, amount <= maxAmount )
then
   modify($l) { setApproved(true) }; // loan is approved
end

rule LargeDepositReject when
   $l: LoanApplication( applicant.age >= 20, deposit >= 1000, amount > maxAmount )
then
   modify($l) { setApproved(false) }; // loan is rejected
end

// ... more loans approval/rejections business rules ...

rule CollectApprovedApplication when
   $l: LoanApplication( approved )
then
   approvedApplications.add($l); // collect all approved loan applications
end
Copy to Clipboard Toggle word wrap

19.3.1. Red Hat build of Quarkus を使用した REST エンドポイントでのルール評価の公開

Red Hat build of Quarkus を使用して、REST エンドポイントで Business Central で開発したルール評価を公開できます。

手順

  1. ルールおよび Quarkus ライブラリーが含まれるモジュールに基づいて新しいモジュールを作成し、REST サポートを提供します。

    新しいモジュールを作成する依存関係の例

    <dependencies>
    
     <dependency>
       <groupId>io.quarkus</groupId>
       <artifactId>quarkus-resteasy</artifactId>
     </dependency>
     <dependency>
       <groupId>io.quarkus</groupId>
       <artifactId>quarkus-resteasy-jackson</artifactId>
     </dependency>
    
     <dependency>
       <groupId>org.example</groupId>
       <artifactId>drools-project</artifactId>
       <version>1.0-SNAPSHOT</version>
     </dependency>
    
    <dependencies>
    Copy to Clipboard Toggle word wrap

  2. REST エンドポイントを作成します。

    以下は、REST エンドポイントを作成する設定例です。

    FindApprovedLoansEndpoint エンドポイントの設定例

    @Path("/find-approved")
    public class FindApprovedLoansEndpoint {
    
       private static final KieContainer kContainer = KieServices.Factory.get().newKieClasspathContainer();
    
       @POST()
       @Produces(MediaType.APPLICATION_JSON)
       @Consumes(MediaType.APPLICATION_JSON)
       public List<LoanApplication> executeQuery(LoanAppDto loanAppDto) {
       	KieSession session = kContainer.newKieSession();
    
       	List<LoanApplication> approvedApplications = new ArrayList<>();
       	session.setGlobal("approvedApplications", approvedApplications);
       	session.setGlobal("maxAmount", loanAppDto.getMaxAmount());
    
       	loanAppDto.getLoanApplications().forEach(session::insert);
       	session.fireAllRules();
       	session.dispose();
    
       	return approvedApplications;
       }
    }
    Copy to Clipboard Toggle word wrap

    上記の例では、ルールを含む 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 クラスの例

    public class LoanAppDto {
    
       private int maxAmount;
    
       private List<LoanApplication> loanApplications;
    
       public int getMaxAmount() {
       	return maxAmount;
       }
    
       public void setMaxAmount(int maxAmount) {
       	this.maxAmount = maxAmount;
       }
    
       public List<LoanApplication> getLoanApplications() {
       	return loanApplications;
       }
    
       public void setLoanApplications(List<LoanApplication> loanApplications) {
       	this.loanApplications = loanApplications;
       }
    }
    Copy to Clipboard Toggle word wrap

    fireAllRules() メソッドが呼び出されると、KieSession が実行され、ビジネスロジックが入力データに対して評価されます。ビジネスロジックの評価後、最後のルールはリストで承認されたアプリケーションをすべて収集し、出力と同じリストを返します。

  3. Red Hat build of Quarkus アプリケーションを起動します。
  4. 確認するローンアプリケーションが含まれる 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-approved
    Copy to Clipboard Toggle word wrap

    JSON の応答例

    [
      {
        "id": "ABC10001",
        "applicant": {
          "name": "John",
          "age": 45
        },
        "amount": 2000,
        "deposit": 1000,
        "approved": true
      }
    ]
    Copy to Clipboard Toggle word wrap

注記

この方法では、ホットリロード機能を使用できないため、プロジェクトのネイティブイメージを作成できません。次の手順では、欠落していた Quarkus 機能は Kogito エクステンションによって提供されます。これにより、Quarkus は DRL ファイルを認識し、ホットリロード機能を同様の方法で実装します。

19.3.2. レガシー API を使用した Red Hat build of Kogito マイクロサービスへのルール評価の移行

REST エンドポイントでルール評価を公開したら、レガシー API を使用してルール評価を Red Hat build of Kogito マイクロサービスに移行できます。

手順

  1. プロジェクトの pom.xml ファイルに以下の依存関係を追加して、Red Hat build of Quarkus およびレガシー API を使用できるようにします。

    Quarkus およびレガシー API を使用する依存関係の例

    <dependencies>
     <dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>kogito-quarkus-rules</artifactId>
     </dependency>
     <dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>kogito-legacy-api</artifactId>
     </dependency>
    </dependencies>
    Copy to Clipboard Toggle word wrap

  2. REST エンドポイント実装を書き換えます。

    REST エンドポイント実装の例

    @Path("/find-approved")
    public class FindApprovedLoansEndpoint {
    
       @Inject
       KieRuntimeBuilder kieRuntimeBuilder;
    
       @POST()
       @Produces(MediaType.APPLICATION_JSON)
       @Consumes(MediaType.APPLICATION_JSON)
       public List<LoanApplication> executeQuery(LoanAppDto loanAppDto) {
       	KieSession session = kieRuntimeBuilder.newKieSession();
    
       	List<LoanApplication> approvedApplications = new ArrayList<>();
       	session.setGlobal("approvedApplications", approvedApplications);
       	session.setGlobal("maxAmount", loanAppDto.getMaxAmount());
    
       	loanAppDto.getLoanApplications().forEach(session::insert);
       	session.fireAllRules();
       	session.dispose();
    
       	return approvedApplications;
       }
    }
    Copy to Clipboard Toggle word wrap

    書き換えられた REST エンドポイント実装では、KieContainer から KieSession を作成する代わりに、統合 KieRuntimeBuilder を使用して KieSession が自動的に作成されます。

    KieRuntimeBuilder は、KieContainer に代わる kogito-legacy-api モジュールが提供するインターフェイスです 。KieRuntimeBuilder を使用すると、KieContainer で同様の方法で KieBaseKieSession を作成できます 。Red Hat build of Kogito はコンパイル時に KieRuntimeBuilder インターフェイスの実装を自動的に生成し、KieRuntime Builder をクラスに統合して FindApprovedLoansEndpoint REST エンドポイントを実装します。

  3. 開発モードで 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 を使用して、オブジェクトを更新または削除できます。

全体的に、ルールユニットには、評価するファクトの定義と、ファクトを評価する一連のルールが含まれます。

手順

  1. POJO を使用してファクト定義を実装します。

    POJO を使用したファクト定義の実装例

    package org.kie.kogito.queries;
    
    import org.kie.kogito.rules.DataSource;
    import org.kie.kogito.rules.DataStore;
    import org.kie.kogito.rules.RuleUnitData;
    
    public class LoanUnit implements RuleUnitData {
    
       private int maxAmount;
       private DataStore<LoanApplication> loanApplications;
    
       public LoanUnit() {
       	this(DataSource.createStore(), 0);
       }
    
       public LoanUnit(DataStore<LoanApplication> loanApplications, int maxAmount) {
       	this.loanApplications = loanApplications;
       	this.maxAmount = maxAmount;
       }
    
       public DataStore<LoanApplication> getLoanApplications() { return loanApplications; }
    
       public void setLoanApplications(DataStore<LoanApplication> loanApplications) {
       	this.loanApplications = loanApplications;
       }
    
       public int getMaxAmount() { return maxAmount; }
       public void setMaxAmount(int maxAmount) { this.maxAmount = maxAmount; }
    }
    Copy to Clipboard Toggle word wrap

    上記の例では、LoanAppDto を使用して LoanUnit クラスを直接バインドします。LoanAppDto は、JSON リクエストをマーシャリングまたはアンマーシャリングするために使用されます。また、上記の例では、org.kie.kogito.rules.RuleUnitData インターフェイスを実装し、DataStore を使用して承認するローンアプリケーションを追加します。

    org.kie.kogito.rules.RuleUnitData はマーカーインターフェイスで、LoanUnit クラスがルールユニット定義の一部であることをデシジョンエンジンに通知します。さらに、DataStore は、新しいルールを実行し、他のルールをトリガーして、ルールエンジンが変更に対応できるようにします。

    また、ルールの結果は、前の例で approved プロパティーを変更します。その間、maxAmount の値はルールユニットの設定パラメーターとして考慮され、これは変更されません。maxAmount は、ルールの評価時に自動的に処理され、JSON リクエストに渡される値から自動的に設定されます。

  2. DRL ファイルを実装します。

    DRL ファイルの実装例

    package org.kie.kogito.queries;
    unit LoanUnit; // no need to using globals, all variables and facts are stored in the rule unit
    
    rule LargeDepositApprove when
       $l: /loanApplications[ applicant.age >= 20, deposit >= 1000, amount <= maxAmount ] // oopath style
    then
       modify($l) { setApproved(true) };
    end
    
    rule LargeDepositReject when
       $l: /loanApplications[ applicant.age >= 20, deposit >= 1000, amount > maxAmount ]
    then
       modify($l) { setApproved(false) };
    end
    
    // ... more loans approval/rejections business rules ...
    
    // approved loan applications are now retrieved through a query
    query FindApproved
       $l: /loanApplications[ approved ]
    end
    Copy to Clipboard Toggle word wrap

    作成する 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 クラスの例

    public class LoanUnitQueryFindApproved implements org.kie.kogito.rules.RuleUnitQuery<List<org.kie.kogito.queries.LoanApplication>> {
    
       private final RuleUnitInstance<org.kie.kogito.queries.LoanUnit> instance;
    
       public LoanUnitQueryFindApproved(RuleUnitInstance<org.kie.kogito.queries.LoanUnit> instance) {
       	this.instance = instance;
       }
    
       @Override
       public List<org.kie.kogito.queries.LoanApplication> execute() {
       	return instance.executeQuery("FindApproved").stream().map(this::toResult).collect(toList());
       }
    
       private org.kie.kogito.queries.LoanApplication toResult(Map<String, Object> tuple) {
       	return (org.kie.kogito.queries.LoanApplication) tuple.get("$l");
       }
    }
    Copy to Clipboard Toggle word wrap

    以下は、ルールユニットを入力として取り、入力をクエリーエグゼキューターに渡して出力を返す REST エンドポイントの例になります。

    LoanUnitQueryFindApprovedEndpoint エンドポイントの例

    @Path("/find-approved")
    public class LoanUnitQueryFindApprovedEndpoint {
    
       @javax.inject.Inject
       RuleUnit<org.kie.kogito.queries.LoanUnit> ruleUnit;
    
       public LoanUnitQueryFindApprovedEndpoint() {
       }
    
       public LoanUnitQueryFindApprovedEndpoint(RuleUnit<org.kie.kogito.queries.LoanUnit> ruleUnit) {
       	this.ruleUnit = ruleUnit;
       }
    
       @POST()
       @Produces(MediaType.APPLICATION_JSON)
       @Consumes(MediaType.APPLICATION_JSON)
       public List<org.kie.kogito.queries.LoanApplication> executeQuery(org.kie.kogito.queries.LoanUnit unit) {
       	RuleUnitInstance<org.kie.kogito.queries.LoanUnit> instance = ruleUnit.createInstance(unit);
       	return instance.executeQuery(LoanUnitQueryFindApproved.class);
       }
    }
    Copy to Clipboard Toggle word wrap

    注記

    複数のクエリーを追加でき、クエリーごとに異なる REST エンドポイントが生成されます。たとえば、FindApproved REST エンドポイントが find-approved 用に生成されます。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat