1概要

この記事では、Java用の最も一般的なルール・エンジンについていくつか説明します。

ミッションクリティカルなアプリケーションでは、ソースコード内でビジネスロジックを維持するプロセスが複雑になりすぎる可能性があります。

ビジネスルールを使用して、ビジネスロジックをソースコードから分離することで開発と保守を容易にすることができます。

Javaの世界では、ほとんどのルールエンジンライブラリはhttps://jcp.org/en/jsr/detail?id=94[Java Rule API Engine]として知られるJSR94標準を実装しています。


2ドロール


Drols

はビジネスルール管理システム(BRMS)ソリューションです。 Droolsは、プロセス、イベントアクティビティ、タスクなどを標準化するためのビジネスプロセス管理ツールであるjBPMと統合できます。

もっと読みたいなら、Droolsの紹介が

ここ



Springとの統合

の記事にあります。


3 OpenL錠


OpenL Tablets

は、Excelの意思決定表に基づくビジネスルール管理システムおよびビジネスルールエンジンです。このフレームワークで使用されるテーブルのフォーマットはビジネスユーザにはよく知られているので、ビジネスユーザと開発者の間のギャップを埋めます。

これは、意思決定表を含むExcelファイルを使用してフレームワークがどのように機能するかを示す簡単な例です。まず、https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.openl%22%20AND%20a%3A%22org.openl.core%に依存する依存関係をインポートしましょう。 22[org.openl.core]およびhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.openl.rules%22%20AND%20a%3A%22org.openl。 rules%22[org.openl.rules]モジュール:

<dependency>
    <groupId>org.openl</groupId>
    <artifactId>org.openl.core</artifactId>
    <version>5.19.4</version>
</dependency>
<dependency>
    <groupId>org.openl.rules</groupId>
    <artifactId>org.openl.rules</artifactId>
    <version>5.19.4</version>
</dependency>

さて、

ユーザー

POJO:

public class User {
    private String name;
   //getters and setters
}

そして、適用されたルールの結果を表す列挙型:

public enum Greeting {
   //...
}


Case

クラスは、結果につながる変数で

User

オブジェクトをラップします。

public class Case {
   //Variables to infer outcomes
   //getters and setters
}

インタフェース

IRule

には、Excelファイルによって挿入されたルールが含まれています。

public interface IRule {
    void helloUser(Case aCase, final Response response);
}


Response

クラスは適用されたルールの戻りを処理します。

public class Response {
    private String result;
    private Map<String, String> map = new HashMap<>();
}

ルールの実行をトリガーするメインクラス。

public class Main {
    private IRule instance;

    public static void main(String[]args) {
        Main rules = new Main();
       //setup user and case here
        rules.process(aCase);
    }

    public void process(Case aCase) {
        EngineFactory<IRule> engineFactory = new RulesEngineFactory<IRule>(
          getClass().getClassLoader()
            .getResource("openltablets/HelloUser.xls"), IRule.class);
        instance = engineFactory.newEngineInstance();
        instance.helloUser(aCase, new Response());
    }
}


4簡単なルール

Easy Rulesは、ビジネスを定義するための軽量でPOJOベースのフレームワークを提供する単純なJavaルールエンジンです。複合パターンを使用することで、原始的な規則から複雑な規則を作成できます。

このフレームワークは、最も伝統的なルールエンジンとは対照的に、アプリケーションからルールを分離するためにXMLファイルやドメイン固有言語ファイルを利用しません。アプリケーションにビジネスロジックを注入するために、アノテーションベースのクラスとメソッドを使用します。

Easy Rulesは、開発者がアプリケーション自体から完全に分離されたビジネスロジックを使用してアプリケーションを作成および管理するのに便利です。一方、このフレームワークはJSR94標準を実装していないため、ビジネスロジックはJavaコードに直接コーディングする必要があります。

ここでは、「こんにちは、世界」の例を示します。

easy-rules-core

モジュール:

<dependency>
    <groupId>org.jeasy</groupId>
    <artifactId>easy-rules-core</artifactId>
    <version>3.0.0</version>
</dependency>

次に、ルールを定義するクラスを作成します。

@Rule(name = "Hello World rule", description = "Always say hello world")
public class HelloWorldRule {

    @Condition
    public boolean when() {
        return true;
    }

    @Action
    public void then() throws Exception {
        System.out.println("hello world");
    }
}

最後に、メインクラスを作成します。

public class Launcher {
    public static void main(String... args) {
       //create facts
        Facts facts = new Facts();

       //create rules
        Rules rules = new Rules();
        rules.register(new HelloWorldRule());

       //create a rules engine and fire rules on known facts
        RulesEngine rulesEngine = new DefaultRulesEngine();
        rulesEngine.fire(rules, facts);
    }
}


5 RuleBook

RuleBookは、Java 8のラムダとChain of Responsibility Patternを利用して単純なBDDアプローチを使用してルールを定義するJavaフレームワークです。

ほとんどのルールエンジンと同様に、RuleBookはルールに提供されるデータである「

事実

」の概念を利用します。 RuleBookは、ルールがファクトの状態を変更することを可能にします。そして、ファクトの状態はチェーンのさらに下流のルールによって読み取られ変更されることができます。あるタイプのデータ(

Facts

)を読み込み、異なるタイプの結果を出力するルールの場合、RuleBookには

Decisions

があります。

RuleBookは、Java DSLを使用してSpringと統合できます。

ここでは、RuleBookを使った簡単な「Hello、world」の例を示します。

https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22com.deliveredtechnologies%22%20AND%20a%3A%22rulebook-core%22

に依存している依存関係を追加しましょう。 rulebook-core]モジュール:

<dependency>
    <groupId>com.deliveredtechnologies</groupId>
    <artifactId>rulebook-core</artifactId>
    <version>0.6.2</version>
</dependency>

それでは、ルールを作成しましょう。

public class HelloWorldRule {
    public RuleBook<Object> defineHelloWorldRules() {
        return RuleBookBuilder
          .create()
            .addRule(rule -> rule.withNoSpecifiedFactType()
              .then(f -> System.out.print("Hello ")))
            .addRule(rule -> rule.withNoSpecifiedFactType()
              .then(f -> System.out.println("World")))
            .build();
    }
}

最後に、メインクラス:

public static void main(String[]args) {
    HelloWorldRule ruleBook = new HelloWorldRule();
    ruleBook
      .defineHelloWorldRules()
      .run(new FactMap<>());
}


6. 結論

このクイック記事では、ビジネスロジックの抽象化のためのエンジンを提供する有名なライブラリについて説明しました。

いつものように、この記事の例は私たちのhttps://github.com/eugenp/tutorials/tree/master/rule-engines[GitHub repository]にあります。