【问题标题】:Drools : How to remove dynamically created drl?Drools:如何删除动态创建的 drl?
【发布时间】:2020-12-09 15:04:26
【问题描述】:

我正在研究一个需要动态添加/更新/删除 drls 的用例。

在这里,我使用规则模板(使用数据库中的数据)生成 drl 字符串,并使用以下代码添加它。

        KieServices ks = KieServices.Factory.get();
        KieRepository kr = ks.getRepository();
        KieFileSystem kfs = ks.newKieFileSystem();
        
        kfs.write("src/main/resources/" + ruleName + ".drl", drl);
        
        KieBuilder kb = ks.newKieBuilder(kfs);
        kb.buildAll();
        
        if (kb.getResults().hasMessages(Message.Level.ERROR)) {
            System.out.println(kb.getResults().toString());
        }
        KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId());

我应该使用哪个 API 来删除这些 drls?

【问题讨论】:

  • KieFileSystem delete 方法不适合你吗?
  • 是的。有效。谢谢!
  • 酷。我将其添加为答案,因此不再只是评论。
  • 删除 drl 是否也会释放内存?我也在动态加载一个规则文件,并希望在处理后删除并释放 ram,但我无法实现。请在这里找到我的问题:stackoverflow.com/questions/69309931/…

标签: drools


【解决方案1】:

KieFileSystem 有一个 delete 方法,这可能是您需要的。您已经使用的write 方法将DRL 文件“写入”到文件系统。 delete 方法会删除该 DRL 文件。您需要在调用该方法时指定文件路径,因此有必要跟踪这些路径,尤其是当您有多个时。

请注意,该方法采用可变参数,因此您可以传递多个文件。

KieServices ks = KieServices.Factory.get();
KieRepository kr = ks.getRepository();
KieFileSystem kfs = ks.newKieFileSystem();

// Write the file:        
kfs.write("src/main/resources/" + ruleName + ".drl", drl);

// Delete the file:
kfs.delete("src/main/resources/" + ruleName + ".drl");

来源:KieFileSystem javadoc

【讨论】:

  • 删除规则后是否需要更新KieContsiner的release id。
  • 你应该问一个单独的问题@sam。此问题和答案未使用版本 ID。
猜你喜欢
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 2012-05-05
相关资源
最近更新 更多