日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

drools规则引擎应用笔记

發布時間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 drools规则引擎应用笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

drools規則引擎筆記

文章目錄

  • drools規則引擎筆記
    • 一、使用示例
      • 1.規則過濾器
      • 2.session連接池
      • 3.debug log
      • 4.規則內容與模型互轉
    • 二、規則編譯及動態加載
      • 1.校驗jar包中的規則
      • 2.自定義classloader
      • 3.動態生成kjar并編譯規則
      • 4.動態加載自定義類和規則文件

一、使用示例

1.規則過濾器

通過AgendaFilter限制fire,默認支持equals、startWith、endWith、Pattern,可自定義AgendaFilter。

final int count = kieSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule1"));

2.session連接池

  • kContainer
KieContainerSessionsPool pool = kContainer.newKieSessionsPool(10); KieSession kSession = pool.newKieSession();
  • kieBase
final KieSessionsPool kieSessionsPool = kieBase.newKieSessionsPool(10); KieSession kSession = kieSessionsPool.newKieSession();

drools.7.13.0 新特性

3.debug log

ksession.addEventListener( new DebugRuleRuntimeEventListener() );
  • pom.xml
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>${logback.version}</version> </dependency>
  • logback.xml
<configuration><logger name="org.drools" level="debug"/>... <configuration>

Drools engine event listeners and debug logging

4.規則內容與模型互轉

@Testpublic void testPackageDescr() {// 默認生成drlfinal PackageDescr descr = DescrFactory.newPackage().name("com.example.demo").newImport().target(java.util.List.class.getName()).end().newGlobal().type(java.util.List.class.getName()).identifier("count").end().newRule().name("rule1").attribute("enabled","true").lhs().pattern(Person.class.getName()).id("$p", false).constraint("name==\"張三\"").end().end().rhs("System.out.println($p);").end().end().getDescr();final String drl = new DrlDumper().dump(descr);System.out.println(drl);System.out.println("=================================================================");// drl解析成模型DrlParser drlParser = new DrlParser();final StringReader reader = new StringReader(drl);try {// 語法結構解析,不做環境校驗(例如Person類是否存在)final PackageDescr descr1 = drlParser.parse(reader);if (drlParser.hasErrors()) {System.out.println(drlParser.getErrors());throw new DroolsParserException("The model drl " + drl + " is not valid");} else {final String drl1 = new DrlDumper().dump(descr1);System.out.println(drl1);}} catch (DroolsParserException e) {e.printStackTrace();}}

二、規則編譯及動態加載

1.校驗jar包中的規則

  • KieContainer方式
KieServices ks = KieServices.Factory.get();ReleaseId releaseId = ks.newReleaseId("com.example", "demo", "1.0");final KieContainer kieContainer = ks.newKieContainer(releaseId);final Results results = kieContainer.verify();final List<Message> messages = results.getMessages(Message.Level.ERROR);
  • KieHelper方式
KieHelper kieHelper = new KieHelper();kieHelper.addContent(content, ResourceType.DRL);Results results = kieHelper.verify();if (results.hasMessages(Message.Level.WARNING, Message.Level.ERROR)) {List<Message> messages = results.getMessages(Message.Level.WARNING, Message.Level.ERROR);System.out.println(messages);}

2.自定義classloader

  • KieBuilder 方式
KieServices ks = KieServices.Factory.get(); final KieBuilder kieBuilder = ks.newKieBuilder(kfs, classLoader)
  • KieHelper方式
KieHelper kieHelper = new KieHelper(); kieHelper.setClassLoader(classLoader);

3.動態生成kjar并編譯規則

@Testpublic void buildRulesTest() {KieServices ks = KieServices.Factory.get();ReleaseId releaseId = ks.newReleaseId("com.example", "demo", "1.0");// kieModule模型KieModuleModel kieModuleModel = ks.newKieModuleModel();kieModuleModel.newKieBaseModel().addPackage("com.example.demo").setDefault(true).newKieSessionModel("session").setType(KieSessionModel.KieSessionType.STATEFUL);// 內存文件系統KieFileSystem kfs = ks.newKieFileSystem().generateAndWritePomXML(releaseId).write("src/main/resources/com/example/demo/r1.drl", "package com.example.demo;\n" +"\n" +"import com.example.drools.Person \n" +"dialect \"mvel\"\n" +"\n" +"\n" +"\n" +"global java.lang.Integer count1;\n" +"\n" +"rule \"rule1\"\n" +" when\n" +" $p:Person(name == \"張三\")" +" then\n" +" System.out.println(\"rule1\");\n" +"end\n").writeKModuleXML(kieModuleModel.toXML());/*** 編譯并自動添加到repository倉庫* @see org.drools.compiler.kie.builder.impl.KieBuilderImpl#buildKieProject(org.drools.compiler.kie.builder.impl.ResultsImpl, org.drools.compiler.kie.builder.impl.KieModuleKieProject, org.drools.compiler.compiler.io.memory.MemoryFileSystem)*/final KieBuilder kieBuilder = ks.newKieBuilder(kfs).buildAll();final Results results = kieBuilder.getResults();final boolean b = results.hasMessages(Message.Level.ERROR);if (b) {System.out.println(results.getMessages());throw new RuntimeException(results.toString());} else {final KieContainer kieContainer = ks.newKieContainer(releaseId);KieSession ksession = kieContainer.newKieSession("session");final Person person = new Person();person.setName("張三");person.setAge(21);ksession.insert(person);int count = ksession.fireAllRules();ksession.dispose();System.out.println(count);}}

4.動態加載自定義類和規則文件

  • 常量
private static final String FILE_SEPARATOR = "/";private static final String SOURCE_PATH = "src/main/java";private static final String RESOURCE_PATH = "src/main/resources";
  • 動態加載自定義類
final KieHelper kieHelper = new KieHelper();// 全限類名String fullQualifiedName = "com.example.Test";// java源代碼String code = "...";final Resource resource = ResourceFactory.newByteArrayResource(code.getBytes(StandardCharsets.UTF_8));resource.setSourcePath(SOURCE_PATH + FILE_SEPARATOR + fullQualifiedName.replace(".", FILE_SEPARATOR) + ".java");// 解決規則文件函數(本質是通過JavaCompiler編譯java源代碼生成class字節碼)的源碼編譯依賴問題kieHelper.addResource(resource, ResourceType.JAVA);
  • 動態加載規則文件
String drl = "..."; kieHelper.addContent(drl, ResourceType.DRL);
  • 動態賦值及規則調用
// 注意:不要執行 kieHelper.build(),此為無用功,且此處的kieBase和kieContainer.getKieBase()雖然均為defaultKieBase,但由于不是同一個kieContainer,所以它們也不是統一kieBase// final KieBase kieBase = kieHelper.build();final KieContainer kieContainer = kieHelper.getKieContainer();final ClassLoader classLoader = kieContainer.getClassLoader();final Class<?> aClass = classLoader.loadClass("com.example.TestInfo11");// 反射操作final Object obj = aClass.newInstance();/*** 注意:每次調用kieHelper.getKieContainer()都會重新編譯規則和類;kieHelper.build()本質也是調用kieHelper.getKieContainer()* ,所以classloader會不斷變化,動態編譯類的class對象也不相同。*/final KieSession kieSession = kieContainer.newKieSession();kieSession.insert(obj);final int count = kieSession.fireAllRules();System.out.println(count);kieSession.dispose();

視頻:
Drools7規則引擎從入門到精通

總結

以上是生活随笔為你收集整理的drools规则引擎应用笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。