首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Drools 7-从DB加载规则

Drools 7-从DB加载规则
EN

Stack Overflow用户
提问于 2020-05-18 10:16:29
回答 1查看 2.8K关注 0票数 0

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

代码语言:javascript
运行
复制
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
StatelessKieSession statelessKieSession = kContainer.newStatelessKieSession();

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

代码语言:javascript
运行
复制
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加载规则时,是否有另一种方法来构建StatelessKieSession?

EN

回答 1

Stack Overflow用户

发布于 2020-07-05 21:03:08

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

代码语言:javascript
运行
复制
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模型

代码语言:javascript
运行
复制
@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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61867320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档