Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用已声明的事实类型动态重新加载规则?_Java_Deployment_Types_Drools_Fact - Fatal编程技术网

Java 如何使用已声明的事实类型动态重新加载规则?

Java 如何使用已声明的事实类型动态重新加载规则?,java,deployment,types,drools,fact,Java,Deployment,Types,Drools,Fact,我在尝试动态重新加载规则时遇到了一个问题。 从上下文开始:我们有DRLs文件,它总共包含10000条规则和各种类型。由于编译和重新部署规则的过程开始很长(超过几分钟),我们只想编译和重新部署修改后的规则 为了符合DRL,我们必须在DRL中声明以重新部署修改后的规则和所有使用的类型 我们的问题是,新DRL中声明的类型没有与已部署的类型合并,因此在匹配这些类型时,新规则不会激活 我在查看ReteoRuleBase对象时发现,TypeDeclaration列表包含两个以“Item”命名的类,这就是重新

我在尝试动态重新加载规则时遇到了一个问题。 从上下文开始:我们有DRLs文件,它总共包含10000条规则和各种类型。由于编译和重新部署规则的过程开始很长(超过几分钟),我们只想编译和重新部署修改后的规则

为了符合DRL,我们必须在DRL中声明以重新部署修改后的规则和所有使用的类型

我们的问题是,新DRL中声明的类型没有与已部署的类型合并,因此在匹配这些类型时,新规则不会激活

我在查看ReteoRuleBase对象时发现,TypeDeclaration列表包含两个以“Item”命名的类,这就是重新部署的规则与正确的对象不匹配的原因

首先,我的单元测试揭示了我们部署和重新部署的方式:

    @Test
public void test_hot_deploy() throws FileNotFoundException {
    File drl1 = new File("src/test/resources/essai-drools/hot-deploy-1.drl"); 
    Resource resource1 = ResourceFactory.newInputStreamResource(new FileInputStream(drl1));

    File drl2 = new File("src/test/resources/essai-drools/hot-deploy-2.drl"); 
    Resource resource2 = ResourceFactory.newInputStreamResource(new FileInputStream(drl2));

    KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    builder.add(resource1, ResourceType.DRL);
    KnowledgeBase kb = builder.newKnowledgeBase();
    StatefulKnowledgeSession session = kb.newStatefulKnowledgeSession();
    int fired = session.fireAllRules();
    Assert.assertEquals(2, fired);

            System.out.println("--- redeploy ---");

    KnowledgeBuilder builder2 = KnowledgeBuilderFactory.newKnowledgeBuilder();
    builder2.add(resource2, ResourceType.DRL);
    kb.addKnowledgePackages(builder2.getKnowledgePackages());

    session = kb.newStatefulKnowledgeSession();
    fired = session.fireAllRules();
    Assert.assertEquals(2, fired);
}
原始DRL(第一个部署的DRL):

重新部署的DRL:

package test;
declare Item
    value : String
end
rule "modification"
when    
    $item : Item(value == "A")
then
    $item.setValue("C");
    update($item);
    System.out.println("Object A -> C");
end
输出:

Object A inserted
Object A -> B
--- redeploy ---
Object A inserted
缺少输出(如您所见,未执行重新部署规则)

你知道我们如何处理这种不合并的类型吗


希望你有个想法,我在这里只是为了提供信息。

从5.2版开始,Drools不支持重新部署类型声明。原因是在java中,类由classloader+class标识。部署类型声明时,需要刷新类加载器,从而有效地创建一个新的类加载器。正如您所注意到的,所有现有规则仍将使用旧的classloader+类,而不会与新的classloader+类匹配


因此,我的建议是,如果需要重新部署规则,请将类型声明保存在单独的DRL文件中,并且只重新部署规则文件。或者,您可以动态生成新规则,或者从文件中提取更改后的规则,并仅重新部署它们

谢谢Edson,它部分解决了我的问题,但还没有完全解决。待问题解决后,我会回来公开修改后的代码。
Object A inserted
Object A -> B
--- redeploy ---
Object A inserted
Object A -> C