当前位置: 首页 > 知识库问答 >
问题:

Drools 7-DB的加载规则

松高歌
2023-03-14

我使用Drools 7作为规则引擎。最初,我使用以下代码从类路径加载规则,以构建无状态KieSession:

KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
StatelessKieSession statelessKieSession = kContainer.newStatelessKieSession();

然后我决定从DB加载规则,下面是代码:

KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
SqlRowSet sqlRowSet = new JdbcTemplate(ds).queryForRowSet("select drl_code from rule");
while(sqlRowSet.next()) {
   Resource r = ResourceFactory.newReaderResource(new StringReader(sqlRowSet.getString("drl_code")));
   knowledgeBuilder.add(r, ResourceType.DRL);
}
KieBase kieBase = knowledgeBuilder.newKieBase();
StatelessKieSession statelessKieSession = kieBase.newStatelessKieSession();

令我担心的是,KnowledgeBuilder界面位于一个内部包(“org.kie.internal”)中。

当使用“公共”API从DB加载规则时,是否有其他方法构建无状态KieSession?

共有1个答案

杜起运
2023-03-14

类似的情况我做了如下。我使用从MYSQL加载规则。

public void reloadRules() {
    // TODO Auto-generated method stub
    List<DroolsDrlModel> droolsDrlModels = droolsDrlDao.findAll();
    KieContainer kieContainer = loadDroolsSessionContainer(droolsDrlModels);
    this.kieContainer=kieContainer;
    KieSession kieSession = this.kieContainer.newKieSession();
     Thread t1 = new Thread(new Runnable() {
         public void run() {
             kieSession.fireUntilHalt();
           
         }
     });

     t1.start();
}
public KieContainer loadDroolsSessionContainer(List<DroolsDrlModel> droolsDrlModels){
        long startTime = System.currentTimeMillis();
        if(this.kieServices == null){
            this.kieServices =  KieServices.Factory.get();
        }
       // add following if you are using timer in your rules
        KieSessionConfiguration ksconf = kieServices.newKieSessionConfiguration();
        ksconf.setOption(TimedRuleExecutionOption.YES);
        KieRepository kr = kieServices.getRepository();
        KieFileSystem kfs = kieServices.newKieFileSystem();
        
        for(DroolsDrlModel drlModel:droolsDrlModels){
             kfs.delete("src/main/resources/" + drlModel.getRuleFileName() + ".drl");
             LOGGER.info("Drools DRL was deleted sucessfully"+drlModel.getRuleFileName());
             kfs.write("src/main/resources/" + drlModel.getRuleFileName() + ".drl", drlModel.getDroolContent());
             LOGGER.info("Drools DRL was created sucessfully "+drlModel.getRuleFileName());
        }
        
        KieBuilder kb = kieServices.newKieBuilder(kfs);
        
        kb.buildAll();
        if (kb.getResults().hasMessages(Message.Level.ERROR)) {
            throw new RuntimeException("Build Errors:\n" + kb.getResults().toString());
        }
        long endTime = System.currentTimeMillis();
        LOGGER.info("Time to build rules : " + (endTime - startTime)  + " ms" );
        startTime = System.currentTimeMillis();
        KieContainer kContainer = kieServices.newKieContainer(kr.getDefaultReleaseId());
        endTime = System.currentTimeMillis();
        LOGGER.info("Time to load container: " + (endTime - startTime)  + " ms" );
        return kContainer;
}

还有我的DroolDrl模特

@Entity(name="rules_table")
public class DroolsDrlModel{
    @Column(name = "drl_file_name")
    private String ruleFileName;
    @Column(name = "drl_content")
    private String droolContent;
    @Column(name = "version")
    private int version;
    // getter and setters
 类似资料:
  • 而类的加载规则, 都是一样的: Yaf规定类名中必须包含路径信息, 也就是以下划线"_"分割的目录信息. Yaf将依照类名中的目录信息, 完成自动加载. 如下的例子, 在没有申明本地类的情况下: 例 5.1. 一个映射的例子Zend_Dummy_Foo //Yaf将在如下路径寻找类Foo_Dummy_Bar {类库路径(php.ini中指定的ap.library)}/Foo/Dummy/Ba

  • 问题内容: 我正在考虑减少使用。js(看起来不错),但我们的网站要求在初始页面加载后动态加载某些样式。但是,似乎所有LESS样式表必须在less.js脚本加载之前先加载。即这有效 但是如果换行,它将失败,除非正确订购,否则Firefox和chrome都不会尝试加载“style.less”。在本教程中明确指出了订购要求。 有什么方法可以在初始页面加载后加载更少的样式表? - 保存您的LESS代码时,

  • 我想知道使用连接到MongoDB的DataLoader是否是一件明智的事情,以及如何实现这一点。 出身背景 我在一个(本地)MongoDB中有大约2000万个文档。超过内存容量的文档太多了。我想在数据上训练一个深层次的神经网络。到目前为止,我一直在首先将数据导出到文件系统,子文件夹被命名为文档的类。但我觉得这种方法是荒谬的。如果数据库中的数据已经得到很好的维护,为什么要先导出(然后删除)。 问题1

  • 我在我的项目中使用drools,并假设它有100条规则。我有两个流程(通常它有开始节点- 现在我使用第一个进程流的kiesation和调用start进程,我看到它加载了所有100条规则而不是只有50条,并给我编译和运行时错误。所以请帮助我理解为什么来自不同规则流组的规则在一个流程中执行,这些规则与它的规则流组无关?我在加载条件时看到了所有这些。

  • 1. 概述 本 PSR 是关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类对应的文件存放路径规范。 关于「能愿动词」的使用 为了避免歧义,文档大量使用了「能愿动词」,对应的解释如下: 必须 (MUST):绝对,严格遵循,请照做,无条件遵守; 一定不可 (MUST NOT):禁令,严令禁止;

  • 我的Junit测试类是这样配置的,以允许autowired。 我的如下所示 在测试上下文中,src/test/resources/application.properties只是空的。 H2应该是一个内存数据库,不能在两个启动之间保存数据!为什么我会收到这些错误? 有什么想法吗?谢谢