gpt4 book ai didi

java - 在另一个 drl 文件的规则中使用一个 drl 文件中的 Drools 类型

转载 作者:行者123 更新时间:2023-11-30 02:11:20 24 4
gpt4 key购买 nike

使用 Drools 7.6.0(尽管我可以升级到更新的版本)。

我有一个由应用程序使用的核心库组成的系统。核心库在 common.drl 文件中定义一些通用规则、类型和全局变量,然后应用程序在另一个 app.drl 文件中定义一些附加规则、类型和全局变量。 app.drl 文件中的规则可以使用 common.drl 中定义的类型和全局变量。

我正在尝试遵循类似 this 的示例,但我收到大量错误,例如:

无法解析对象类型“myType”:[规则名称=“我的规则”]

其中“我的规则”来自 app.drl,而 myType 来自 common.drl。

此模式是否不受支持,或者我需要采取一些额外的步骤才能使其正常工作?

这是演示该问题的简化版本:

common.drl:

package mypackage

declare MyType
myField : String
end

app.drl:

package mypackage

rule "My Rule"
when
$element : MyType()
then
System.out.println("worked");
end

java:

package mypackage;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.Message;
import org.kie.api.builder.Results;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class MultiLoadTest {

public static void main(String[] args) throws FileNotFoundException {

KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
// repeat
FileInputStream fisCommon = new FileInputStream( "src/main/resources/rules/common.drl" );
kfs.write( "src/main/resources/simple.drl",
kieServices.getResources().newInputStreamResource( fisCommon ) );

FileInputStream fisApp = new FileInputStream( "src/main/resources/rules/app.drl" );
kfs.write( "src/main/resources/simple.drl",
kieServices.getResources().newInputStreamResource( fisApp ) );
// end
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 kieSession = kieContainer.newKieSession();


}

}

输出:

2018-04-23 13:53:00,872 [main] ERROR Unable to build KieBaseModel:defaultKieBase
Unable to resolve ObjectType 'MyType' : [Rule name='My Rule']


Exception in thread "main" [Message [id=1, kieBase=defaultKieBase, level=ERROR, path=simple.drl, line=5, column=0
text=Unable to resolve ObjectType 'MyType']]
java.lang.IllegalStateException: ### errors ###
at mypackage.MultiLoadTest.main(MultiLoadTest.java:35)

最佳答案

对我来说,你的例子按预期工作。因此,我认为问题出在配置/依赖项或您未提供的部分中。

我可以提供工作示例(spring+maven+junit5)来展示如何从 session 中插入和检索 drools 声明的类型,而不是遍历所有这些细节。

请关注GitHub link .

特别test link .

关于java - 在另一个 drl 文件的规则中使用一个 drl 文件中的 Drools 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49986511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com