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

将规则添加到现有KiePackage和KieBase中

松正阳
2023-03-14

我正在尝试将规则添加到已经使用KieBuilder定义和构建的KiePackage。

我知道您可以使用以下方式删除规则:

base.removeRule("com.somepackage", "ruleName");

但是否有一个添加规则的等价物?我尝试添加一个新的。将drl文件导入KieFileSystem,并使用KieScanner获取更改,但它似乎不起作用:

KieBaseConfiguration config = service.newKieBaseConfiguration();
KieBase base = kContainer.newKieBase(config);

KieFileSystem fileSystem = service.newKieFileSystem(); 
KieBuilder builder = service.newKieBuilder(fileSystem); 

fileSystem.write(originalDrlFile, someFile)    
builder.buildAll()                               // first drl is loaded

fileSystem.write(newlDrlFile, someFile)    

KieScanner scanner = service.newKieScanner(kContainer);
scanner.scanNow();
KieSession ksession1 = kContainer.newKieSession();    

builder.buildAll()                               // reloading with new drl.

当我评估一个事实与ksesion1时,新规则不存在于KieBase中。我错过了什么吗?

共有2个答案

施飞鸿
2023-03-14

我们在哪里建立kieBuilder和kieBase之间的关系?

我试过这样的东西。。

kieContainer= kieService.newKieContainer(kiebuilder.getKieModule().getReleaseId());
kieSession = kieContainer.newKieSession();
养焱
2023-03-14
private KieSession kieSession;
public void build() throws Exception {
    KieServices kieServices = KieServices.Factory.get();

    KieFileSystem kfs = kieServices.newKieFileSystem();
    FileInputStream fis2 = new FileInputStream( "override/r2.drl" );
    kfs.write( "src/main/resources/r2.drl",
                kieServices.getResources().newInputStreamResource( fis2 ) );
    FileInputStream fis1 = new FileInputStream( "override/r1.drl" );
    kfs.write( "src/main/resources/r1.drl",
                kieServices.getResources().newInputStreamResource( fis1 ) );

    KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();

    Results results = kieBuilder.getResults();
    if( results.hasMessages( Message.Level.ERROR ) ){
        System.out.println( results.getMessages() );
        throw new IllegalStateException( "### errors ###" );
    }

    KieContainer kieContainer =
        kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );

    KieBase kieBase = kieContainer.getKieBase();
    kieSession = kieContainer.newKieSession();
}

构建方法演示了增量构建。要添加规则,可以再次使用附加的DRL文件和新规则来完成整个过程。或者,如果保留KieFileSystem,可以稍后添加DRL文件,再次调用buildAll,重新创建KieBase,等等。

 类似资料:
  • 我尝试在从KieBase中删除规则后重新创建KieSession,但删除的规则仍在触发。 我使用以下代码创建了一个KieBase并删除了一条规则: 但是当我根据ksesion1评估一个事实时,rule1仍然在触发。如何将编辑后的KieBase重新加载到新会话中?

  • 我想将Lambda目标添加到现有的CloudWatch规则中。我使用以下内容引用现有规则: 后来我添加了一个目标: 执行cdk synth或deploy时,出现以下错误: 对象没有属性add_target 我知道IRule元素没有那种方法,但我找不到一个明确的方法来实现我所需要的。 我还尝试在Lambda中使用事件源,但出现以下错误: 无法识别的事件源,必须是kinesis、Dynamodb st

  • 我想将不同的drl文件加载到一个kiebase中,如果规则没有显著性属性附加到它们,默认的执行顺序会与在kmodule中指定的顺序对齐吗?我的意思是,Drools在幕后,只需要从多个drl文件中自动创建一个大的drl文件,然后执行。我的理解是,如果规则文件中的规则没有显著性,那么当它们被写入时,它们将被执行,除非对现有事实进行任何修改/插入,否则可能会重新触发规则的无序。 谢谢你。

  • 我已经为用户设置了firebase规则,以便向数据库读取和写入数据。现在我想为管理员用户添加另一条规则。 我允许用户通过身份验证进行访问。uid,并希望为管理员用户设置另一个级别。 以下是我目前的规则: 我通过url中的$uid获取数据,如下所示: 用户通过电子邮件和密码注册。有没有一种方法可以添加一个特定的用户作为管理员,并设置另一个规则来访问所有的数据?

  • 我有一个现有的Solr设置,运行在一个独立的Solr实例上。我被要求为此设置添加弹性和高可用性。因此,我想将复制添加到我的设置中,我认为SolrCloud是一种方式? 我已经在SolrCloud wiki上浏览了演示。然而,我不确定如何将现有的Solr实例添加到ZooKeeper,然后再添加一些节点以供复制。这是否可以不重新膨胀? 维基上说 注意:如果不使用示例启动solr,请确保在创建集合之前将

  • 我有一个名为的现有表。在这个表中,我有5列: persionId 人名 PMid 描述 Pamt 创建此表时,我将和设置为主键。 我现在想在主键中再包含一列——PMID。我如何编写一个语句来做到这一点?(表中已经有1000条记录了)