使用Drools 7.6.0(尽管我可以升级到新版本)。
我有一个由应用程序使用的核心库组成的系统。核心库在common.drl文件中定义了一些通用规则,类型和全局变量,然后应用程序在另一个app.drl文件中定义了一些其他规则,类型和全局变量。 app.drl文件中的规则可以使用common.drl中定义的类型和全局变量。
我正在尝试遵循this之类的示例,但出现很多错误,例如:Unable to resolve ObjectType 'myType' : [Rule name='My Rule']
我的规则来自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),该示例演示如何从会话中插入和检索已声明的Drool类型。
请按照GitHub link。
特别是test link。
关于java - 在另一个drl文件中的规则中使用一个drl文件中的Drools类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49986511/