从Drools 6.0.1迁移到Drools 6.3.0-Final遇到了意外的全局[log]错误

时间:2016-03-15 07:35:09

标签: java drools

Textview
  1. 从数据库中检索DRL作为字符串列表。
  2. 我们不使用kmodule.xml 发表评论后: DRL(最小化设置以尝试找到问题)加载没有任何障碍,但不知何故定义在其中的全局变量,不是。
  3. KieSession创建代码

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="@android:color/darker_gray" >
    
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="Settings"
                android:gravity="center_vertical"
                android:layout_alignParentLeft="true"
                android:textColor="@android:color/holo_orange_dark"
                android:textSize="16.0sp" />
    
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="hiiiiiiiiiiiii StackOverflower!!!!!!!!!!!"
                android:padding="4dp"
                android:gravity="center"
                android:layout_toLeftOf="@+id/txtBack"
                android:textColor="@android:color/white"
                android:textSize="19sp" />
    </RelativeLayout>
    

2 个答案:

答案 0 :(得分:2)

在另一个答案中阅读了与@laune的聊天后,我想现在已经确定了问题:你的KieBase并不包含你认为它的工件(规则,全局等)。

不知道您的代码可能出现什么问题,但我认为一个简单的解决方法可以帮助您避免使用那些样板(并且容易出错)的代码。

这里的想法是使用KieHelper类,而不是使用KieRepositoryKieFileSystemKieBuilder。实际上,创建KieHelper类是为了避免在创建KieBase时涉及的复杂步骤(与Drools 5.x相比)。

使用KieHelper类,您可以重构代码,使其看起来与此类似:

KieHelper kieHelper = new KieHelper();
for (String ruleId : drls.keySet()) {
    kieHelper.addContent(drls.get(ruleId), ResourceType.DRL);
}
Results results = kieHelper.verify();
for (Message message : results.getMessages()) {
    log.error(">> Message ({}): {}", message.getLevel(), message.getText());
}

if (results.hasMessages(Message.Level.ERROR)) {
    throw new IllegalStateException("There are errors in the KB.");
}

KieSession ksession = kieHelper.build().newKieSession();

希望它有所帮助,

答案 1 :(得分:1)

在您的Java代码中,您有一些调用,如

kieSession.setGlobal( "log", ... );

应该在.drl文件中有对应项,例如

global ... log;

但它没有。 (点分别标记对象引用的位置和相应的类型。)

查看您的代码......

kFileSystem.write(resource);

我强烈建议您使用具有此相对路径的表单:

kFileSystem.write( "src/main/resources/" + ruleId + ".drl,
                   resource );

或修改资源目标路径:

resource.setTargetPath("src/main/resources/hello.drl");

(您的代码工作:

resource.setTargetPath("./out/hello.drl");

稍后,在编译期间,这会导致警告&#34;找不到KieBase defaultKieBase&#34;的文件。 Drools手册包含这句话&#34;这些工件必须添加到相应的常规Maven项目的相同位置。&#34;但并不能简单地解释这意味着什么,这会更有帮助。)

没有&#34;全球&#34;当然,在您的DRL代码中,相当于无法编译知识库,即您的会话在空知识库上运行。