Java中的规则引擎

Java 中的规则引擎为我们提供了一个以灵活且定义的方式管理和执行业务规则的框架。这些引擎使开发人员能够在不更改核心应用程序的情况下更轻松地修改和理解规则,从而将业务逻辑与应用程序代码分开。

规则引擎旨在评估条件并根据指定规则触发操作。它们还为我们提供了一种更加动态和适应性更强的方法来处理复杂的决策过程。本文介绍了允许开发人员自动化其软件应用程序逻辑的各种规则引擎。通过集成这些规则引擎,开发人员可以为业务策略的自动化做出重大贡献,最终产生更强大、更有效的软件应用程序。

Java 中的规则引擎是什么?
Java中的规则引擎确实是强大的工具,可以自动化业务逻辑,从而实现更高效的决策过程。这些引擎允许开发人员独立于应用程序代码定义和管理业务规则,提供灵活的条件和操作,从而允许动态决策方法来处理复杂的决策场景。将业务规则与核心应用程序逻辑分离有助于更好的代码组织、可重用性和易于维护。

规则引擎的好处:

  1. 它为我们提供了很好的代码可重用性。
  2. 由于规则引擎独立于相关应用程序代码运行,因此无需直接操作源代码,从而降低了复杂性。
  3. 它还提供了可读性和灵活性,我们可以在不更改源代码中的任何内容的情况下更改规则。
  4. 它允许将业务规则与应用程序代码分离,而不影响核心程序。
  5. 它有助于业务专家和开发人员在不了解高级编码技能的情况下进行协作,从而使决策非常有效和合乎逻辑。

规则引擎如何工作?
第 1 步:设置您的 Java 项目
要设置 Java 项目,您需要创建一个新的 Java 项目,也可以使用现有项目。在 Java 项目中实现规则引擎之前,您必须准备一个 Java 项目,并在 Java 项目中配置所需的设置。

步骤 2:在 pom.xml 文件或 yml 文件中添加规则引擎工具依赖项。
例如,如果您使用的是Maven,则在 xml 文件中添加 Drools 引擎的依赖项。

<dependencies> 
    <dependency> 
        <groupId>org.drools</groupId> 
        <artifactId>drools-core</artifactId> 
        <version>7.65.0.Final</version> <!-- Use the latest version available -->
    </dependency> 
</dependencies>

第 3 步:创建事实类
事实类是指表示将应用规则的数据或事实的类,在以下示例中,“Person”类被视为事实类。通常在规则引擎中,特别是在Drools规则引擎的情况下,class.java被替换为事实类并且通常表示为class.java或person.java。

// Person.java 
public class Person { 
    private String name; 
    private int age; 
    private boolean eligibleForDiscount; 
    private boolean specialStatus; 

    
// Your Getters and setters 
}

第 4 步:在 Java 项目中编写规则
在这里,我们为 Drools 规则引擎创建一个名为“GeeksRule.drl”的规则文件,其中“drl”是 Drools 规则的扩展名。

// GeeksRule.drl 
rule
"Test Rule"
    when 
        $person: Person(age < 30, name.contains(
"Test")) 
    then 
        $person.setSpecialStatus(true); 
end

“Test”规则是分配给该规则的名称,它用作识别和可读性的标签,“结束”标记表示该特定规则的结束。这条规则规定,如果一个人的年龄小于30岁,并且其名字中包含“Test”,那么他们将被授予特殊身份。

第 5 步:在 Java 代码中使用 Drools
创建一个 Java 类以使用 Drools 来评估 Test 规则。

import org.kie.api.*; 
import org.kie.api.runtime.*; 

public class RuleEngineExample { 
    public static void main(String[] args) { 
        KieServices kieServices = KieServices.Factory.get(); 
        KieContainer kieContainer = kieServices.getKieClasspathContainer(); 
        KieBase kieBase = kieContainer.getKieBase(); 
        KieSession kieSession = kieBase.newKieSession(); 

        Person person = new Person("Test User", 25); 
        kieSession.insert(person); 

        int ruleFiredCount = kieSession.fireAllRules(); 

        System.out.println(
"Rules fired: " + ruleFiredCount); 
        System.out.println(
"Is person eligible for a special status? " + person.isSpecialStatus()); 

        kieSession.dispose(); 
    } 

第 6 步:运行 Java 项目
运行您的 Java 项目,您应该看到输出,指示 Test 规则是否被解雇,以及该人是否有资格根据提供的姓名和年龄获得特殊状态。上面的示例演示了如何使用 Drools 在 Java 项目中应用与 Test 相关的规则。根据您的特定用例的需要调整规则和数据对象。

Java 中流行的规则引擎
1.Drools
Drools规则引擎被广泛称为“业务规则管理系统”(BRMS),它被广泛用作Java的开源规则引擎,它有助于鼓励开发人员实现和管理此类复杂的业务逻辑。具有专有功能,Drools 是不同领域中基于规则的软件应用程序的 Java 开发人员的首选。

// Define a rule 
rule
"Example Rule"
    when 
        $fact: SomeObject(property > 10) 
    then 
        
// Actions to be executed when the rule is matched 
        $fact.setFlag(true); 
end

2.Jess
Jess是一个专为Java平台设计的规则引擎,在开发专家系统时经常在Java应用程序中使用。其用户友好的脚本语言和强大的推理引擎使其非常适合复杂的决策制定,并有助于将其建立为此类任务的有价值的选择,这些任务需要在 Java 应用程序中使用基于高级规则的系统。

// Define a rule 
(defrule example-rule 
    (some-object (property > 10)) 
    => 
    (modify some-object (set-flag true)))


3. Easy Rule
Easy Rules 被认为是 Java 的轻量级且简单的规则引擎,其突出之处在于提供规则抽象,用于根据定义的操作和条件创建规则。它的简单性和灵活性使其成为寻求简单而有效的解决方案来实现和管理 Java 应用程序中的规则并促进应用程序中业务逻辑的无缝集成的开发人员的首选。

// Define a rule 
Rule someRule = new BasicRuleBuilder() 
    .name(
"Example Rule"
    .when(facts -> facts.get(
"property", Integer.class) > 10) 
    .then(facts -> facts.put(
"flag", true)) 
    .build(); 


4. RuleBook
规则手册提供了用户友好且灵活的 DSL,使其规则创建变得简单。而对于较大的规则集合,开发人员可以将规则平滑地集成到带注释的POJO类中。RuleBook 有效地将这个包转换为有组织的规则手册,从而简化了 Java 应用程序中各种规则的组织和管理。

public class DelftstackRule { 
public RuleBook<Object> defineDelftstackRules() { 
    return RuleBookBuilder.create() 
        .addRule(rule -> rule.withNoSpecifiedFactType().then(f -> System.out.print("Delftstack"))) 
        .addRule(rule 
            -> rule.withNoSpecifiedFactType().then( 
                f -> System.out.println(
"The Best Tutorial Site"))) 
        .build(); 

}

5.OpenL Tablets
OpenL Tablets 是一个用于 Java 的开源业务规则和决策管理系统,它是业务规则引擎和管理系统中不可或缺的组件。它的适应性和可扩展性使其成为那些寻求强大的解决方案以在 Java 应用程序中有效地实施、组织和管理其业务规则的开发人员的宝贵工具,它还确保了高效的决策过程。

// Define a rule in OpenL Tablets 
public class Rules { 
    public boolean exampleRule(int property) { 
        return property > 10; 
    } 
}

6.Eclipse OCL(对象约束语言)
Eclipse OCL(对象约束语言)不仅仅是一个规则引擎,因为它是一种专门的语言,旨在表达 UML 模型中对象的规则。其独特的功能使开发人员能够精确定义和执行规则,并塑造 Java 应用程序中对象的行为和关系,也使 Eclipse OCL 成为确保在此类复杂应用场景中的准确性和符合指定标准的宝贵资产。

// Define a constraint 
context SomeObject 
inv: self.property > 10


7. Apache Jena 规则
Apache Jena 规则是一个 Java 框架,用于构建语义 Web 和链接数据应用程序,展示了专为处理 RDF 数据而设计的强大规则引擎。该框架为开发人员提供了强大的工具来导航、查询和推断 RDF 数据集中的关系,也使其成为那些从事涉及语义 Web 技术的高级应用程序开发的人员的重要资产。

// Define a rule in Jena 
String ruleString =
"[r1: (?x ex:property ?y) -> (?x ex:flag true)]"
Reasoner reasoner = new GenericRuleReasoner(Rule.parseRules(ruleString));

8. Nools
Nools 被认为是Node.js的规则引擎,通过Nashorn JavaScript引擎的帮助,它可以轻松地将其实用性扩展到 Java,该引擎包含在从 Java 8 开始的Java 开发工具包 (JDK)中。这种兼容性增强了开发人员利用Nools 的基于规则的功能最初是为 Java 应用程序中的 Node.js 设计的,该规则为跨不同环境实施和管理规则提供了灵活的解决方案。

// Define a rule in Nools (JavaScript syntax) 
define SomeRule { 
    when { 
        $s: SomeObject $s.property > 10
    } 
    then { 
        $s.flag = true
    } 
}


结论
总之,本文讨论了为什么 Java 规则引擎很重要,因为我们已经了解了它们如何帮助业务自动工作并更快地做出决策。这些引擎允许开发人员自己处理规则,使代码灵活且易于一起处理。Drools 的分步指南就像一堂实践课程,查看不同的引擎,如 Drools、Jess、Easy Rules、Rule Book、OpenL Tablets、Eclipse OCL、Apache Jena Rules 和 Nools,显示有很多选择。使用规则引擎就像赋予软件调整和保持强大的能力,这使得它们对于当今的 Java 开发非常有用。