@[TOC](Drools 入门实例(二))
Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.
目录
Drools 动态加载规则
使用KnowledgeBuilder
在Drools中,可以使用KnowledgeBuilder来动态加载规则。KnowledgeBuilder是用于将规则文件编译成可执行的规则的工具。
下面是使用KnowledgeBuilder动态加载规则的步骤:
- 创建一个KnowledgeBuilder对象:
KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
- 使用KnowledgeBuilder加载规则文件(可以是.drl或.xls文件):
knowledgeBuilder.add(ResourceFactory.newClassPathResource("rules/rules.drl"), ResourceType.DRL);
- 检查规则文件是否有错误:
if (knowledgeBuilder.hasErrors()) {
System.out.println(knowledgeBuilder.getErrors().toString());
throw new RuntimeException("Error compiling rules");
}
- 获取已加载的规则包:
Collection<KnowledgePackage> knowledgePackages = knowledgeBuilder.getKnowledgePackages();
- 创建一个KnowledgeBase对象:
KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
- 将加载的规则包添加到KnowledgeBase中:
knowledgeBase.addKnowledgePackages(knowledgePackages);
- 创建一个StatefulKnowledgeSession对象:
StatefulKnowledgeSession session = knowledgeBase.newStatefulKnowledgeSession();
- 插入事实对象到会话中,然后执行规则:
FactType factType = knowledgeBase.getFactType("rules", "Customer");
Object fact = factType.newInstance();
factType.set(fact, "name", "John");
session.insert(fact);
session.fireAllRules();
通过上述步骤,可以在运行时动态加载和执行规则。注意,如果有多个规则文件,可以重复步骤2到步骤6来加载并添加多个规则包到KnowledgeBase中。
使用KnowledgeContainer
Drools支持动态加载规则,这可以通过使用KnowledgeContainer来实现。
KnowledgeContainer是Drools中的一个接口,用于管理和加载规则。它提供了一种将规则集合加载到内存中的机制,并提供了对这些规则的访问和执行。
以下是一些使用KnowledgeContainer的步骤:
- 创建一个KnowledgeContainer实例,可以使用Drools提供的默认实现KnowledgeBaseFactory.newKnowledgeContainer()来创建。
KnowledgeContainer container = KnowledgeBaseFactory.newKnowledgeContainer();
- 使用KnowledgeBuilder创建规则集,并将其添加到KnowledgeContainer中。KnowledgeBuilder是用于解析和编译规则的工具类。
KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
builder.add(ResourceFactory.newFileResource("rules.drl"), ResourceType.DRL);
container.addKnowledge(builder.getKnowledgePackages());
- 从KnowledgeContainer中获取KnowledgeBase,KnowledgeBase是Drools中的核心对象,用于执行规则。
KnowledgeBase knowledgeBase = container.getKnowledgeBase();
- 使用KnowledgeBase创建StatefulKnowledgeSession或StatelessKnowledgeSession来执行规则。
StatefulKnowledgeSession session = knowledgeBase.newStatefulKnowledgeSession();
session.insert(fact);
session.fireAllRules();
通过使用KnowledgeContainer,您可以在运行时动态加载和执行规则。这对于那些需要根据特定条件动态更改和加载规则的应用程序非常有用。
Drools 事件推理
引入时间窗口
在Drools中,可以使用动态加载规则来动态地添加、移除或修改规则。这可以通过使用KieBase和KieSession来实现。
首先,创建一个KieBase对象,用于加载规则。可以使用KieContainer从类路径或其他位置加载规则文件。
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
KieBase kieBase = kieContainer.getKieBase();
接下来,创建一个KieSession对象,用于执行规则。可以使用KieBase.newKieSession()方法创建一个新的KieSession。
KieSession kieSession = kieBase.newKieSession();
现在,你可以向KieSession中动态添加规则。可以使用KieSession.getKieBase().addPackages()方法加载新的规则包。
kieSession.getKieBase().addPackages(kieContainer.getKieBase().getKiePackages());
加载新的规则包会在下一次执行规则时生效。
对于时间窗口,你可以在规则中使用Drools的时间窗口函数来定义规则的时间范围。例如,你可以使用"after"函数来定义一个规则在某个时间点之后生效。
rule "My Rule"
when
$event : Event() after "2019-01-01T00:00:00Z"
then
// 规则逻辑
end
在以上规则中,只有在"2019-01-01T00:00:00Z"之后发生的Event事件才会触发规则。
定义规则触发条件
Drools 是一个基于规则引擎的开源项目,它可以帮助开发人员动态加载规则并在特定条件下触发这些规则。
要动态加载规则,首先需要将规则定义存储在一个规则文件中,这可以是一个独立的文件,也可以是一个包含多个规则的文件。规则文件通常使用DRL(Drools Rule Language)格式进行编写。
在程序运行时,可以使用Drools API 将规则文件加载到Drools引擎中。加载规则文件的代码通常类似于下面的示例:
KieServices ks = KieServices.Factory.get();
KieContainer kc = ks.getKieClasspathContainer();
KieSession ksession = kc.newKieSession("rulesSession");
在加载规则文件后,可以使用Drools提供的API在适当的情况下触发规则的执行。例如,可以在满足特定条件时调用ksession.fireAllRules()
方法来触发规则的执行。
要定义规则的触发条件,可以使用DRL语言中的when子句。当满足when子句中定义的条件时,规则会被触发执行。例如,下面是一个简单的规则示例:
rule "My Rule"
when
$person : Person(age > 18)
then
System.out.println("Person is an adult");
end
在上述规则示例中,当
Drools 链式调用
通过drools-api添加规则
要动态加载规则,可以使用Drools API来添加规则。以下是一个示例代码:
// 创建KieServices对象
KieServices ks = KieServices.Factory.get();
// 创建KieContainer对象
KieContainer kContainer = ks.getKieClasspathContainer();
// 创建KieSession对象
KieSession kSession = kContainer.newKieSession();
// 创建一个新的规则字符串
String rule = "rule \"MyRule\"\n" +
"when\n" +
" $person : Person( age > 18 )\n" +
"then\n" +
" System.out.println(\"Adult person: \" + $person.getName());\n" +
"end";
// 使用KieFileSystem创建一个新的规则文件
KieFileSystem kfs = ks.newKieFileSystem();
kfs.write("src/main/resources/rules/myRule.drl", rule.getBytes());
// 使用KieBuilder构建新的规则
KieBuilder kieBuilder = ks.newKieBuilder(kfs).buildAll();
// 检查规则构建是否存在错误
Results results = kieBuilder.getResults();
if (results.hasMessages(Message.Level.ERROR)) {
System.out.println(results.getMessages());
throw new IllegalStateException("规则构建中存在错误");
}
// 获取KieContainer对象
kContainer = ks.newKieContainer(kContainer.getReleaseId());
// 获取KieSession对象(可选步骤)
kSession = kContainer.newKieSession();
// 在KieSession中插入事实对象
Person person = new Person("John", 25);
kSession.insert(person);
// 执行规则
kSession.fireAllRules();
// 关闭KieSession对象
kSession.dispose();
在上述代码中,我们首先创建了一个KieServices对象,然后使用该对象获取KieContainer和KieSession对象。
接下来,我们创建了一个新的规则字符串,并使用KieFileSystem将其写入到规则文件中。
然后,我们使用KieBuilder构建规则,并检查规则构建是否存在错误。
最后,我们获取KieContainer对象,并在KieSession中插入事实对象。最后,我们执行规则并关闭KieSession对象。
这样,我们通过Drools API成功动态加载了规则。
通过drools-api执行规则
可以使用Drools的API来执行规则,并且可以通过链式调用的方式来设置规则的一些属性。
首先,你需要创建一个KieSession对象来加载规则并执行。可以通过KieContainer来加载规则文件,然后获取KieSession对象。
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession();
接下来,可以使用KieSession对象来执行规则。可以通过insert方法将事实对象插入到规则引擎中,并通过fireAllRules方法触发规则执行。
kSession.insert(factObject);
kSession.fireAllRules();
此外,还可以通过FactHandle来对事实对象进行操作,比如更新或者删除。
FactHandle factHandle = kSession.insert(factObject);
// 更新事实对象
kSession.update(factHandle, updatedFactObject);
// 删除事实对象
kSession.delete(factHandle);
在执行规则之前,你可能需要设置一些全局变量、配置、监听器等。可以通过KieSession的设置方法来完成。
kSession.setGlobal("name", "value");
kSession.addEventListener(new MyAgendaEventListener());
最后,记得在规则执行完成后关闭KieSession。
kSession.dispose();
通过以上的链式调用,你可以方便地使用Drools的API来执行规则。
Drools 与其他规则引擎的比较
JBoss Drools vs IBM ODM
JBoss Drools vs DROOLS.NET
JBoss Drools vs Jess
Drools 应用的领域:
金融行业,物流行业,人工智能领域
Drools 进阶学习
Ruleflow:
Drools 是一个基于规则引擎的开源业务规则管理系统。规则引擎是一种通过编写规则来实现决策和逻辑流程的技术。Drools 的规则流是由一组规则组成的有序序列,它定义了规则引擎的执行顺序和规则之间的关系。
Drools 的规则流可以分为以下几个部分:
-
规则库(Rule Base):规则库是存储规则的地方,它包含了所有的规则和规则流。规则库通常以 XML 或 DRL(Drools Rule Language)的形式进行定义和存储。
-
规则(Rule):规则是规则库中的基本单元,它由条件(即规则的前提)和动作(即规则的执行结果)组成。规则是以 if-then 的形式定义的,if 部分描述了规则的前提条件,then 部分描述了规则的执行结果。
-
规则流(Rule Flow):规则流定义了规则引擎中规则的执行顺序和规则之间的关系。规则流是一种有向有环图,其中每个节点表示一个规则或规则组,每个边表示规则之间的控制流程。规则流可以用来定义复杂的业务逻辑和工作流程。
-
规则引擎(Rule Engine):规则引擎是执行规则流的核心组件。它根据规则流中的顺序和条件,逐步执行规则,并根据规则的结果进行控制流程的跳转和执行。
Drools 的规则流使得业务逻辑的编写和管理变得更加灵活和可维护。通过定义规则和规则流,开发人员可以快速修改和调整业务逻辑,而无需修改代码。这种基于规则引擎的开发方式可以提高开发效率和系统灵活性,适用于复杂的业务应用场景。
:Decision Tables:
Drools决策表是一种规则引擎,它提供了一种可视化的方式来定义和管理业务规则。决策表是一个电子表格,其中包含了规则的条件和动作。
在Drools决策表中,每一行代表一条规则,每一列代表规则的条件或动作。规则的条件用于判断是否满足规则的条件,规则的动作定义了在满足条件时要执行的操作。
决策表可以轻松地定义复杂的规则逻辑,并且可以很容易地修改和维护。通过使用决策表,业务用户可以直接参与规则的定义和管理,而无需编写复杂的代码。
Drools决策表还可以与其他技术和工具集成,如Excel,数据库和Web服务。这使得决策表可以与现有系统无缝集成,并与其他业务流程和决策支持系统进行通信。
总之,Drools决策表是一个强大而灵活的工具,可以帮助企业快速响应市场变化和调整业务规则。通过使用决策表,企业可以更加智能地管理和执行业务规则,从而提高业务的效率和准确性。
:Query
“Drools” 是一个基于Java的规则引擎,用于实现业务规则和复杂事件处理。它可以用于构建决策引擎、工作流引擎、风险评估系统等各种应用。它提供了一种声明式的编程模型,使得开发人员可以将业务规则和逻辑从应用程序中分离出来,从而实现更灵活的规则管理和易于维护的系统。Drools 还提供了一个基于规则的语言(DRL)来描述和定义规则。
:Agenda Group:
:Rule Templates:
Drools规则模板是一种定义规则的模板,它可以在Drools引擎中使用。这些模板可以定义规则的结构和变量,以及规则中的条件和动作。使用规则模板可以简化规则的编写过程,提高规则的可读性和可维护性。
规则模板由两部分组成:规则模板声明和规则模板定义。
规则模板声明包含规则的名称和参数列表。规则模板定义定义了规则的条件和动作。其中,条件是规则触发的条件,动作是规则触发后执行的操作。
在规则模板中,可以使用变量来表示规则中的参数。这些变量可以在规则模板的定义中使用,并在规则执行时被实际的参数值替换。
使用规则模板,可以根据不同的参数值生成多个具体的规则。这样,可以避免编写重复的规则,并且可以根据需要动态生成规则。
总之,Drools规则模板是一种方便的规则定义方式,它可以简化规则的编写过程,并提供更灵活和可扩展的规则定义方式。
参考资料和推荐阅读
参考资料
官方文档
开源社区
博客文章
书籍推荐
- 暂时无
欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!同时,期望各位大佬的批评指正~,如果有兴趣,可以加文末的交流群,大家一起进步哈