在另一个 drl 文件的规则中使用来自一个 drl 文件的 Drools 类型
Using Drools types from one drl file in rules in another drl file
使用 Drools 7.6.0(虽然我可以升级到更新的版本)。
我有一个由应用程序使用的核心库组成的系统。核心库在 common.drl 文件中定义了一些通用规则、类型和全局变量,然后应用程序在另一个 app.drl 文件中定义了一些附加规则、类型和全局变量。 app.drl 文件中的规则可以使用 common.drl.
中定义的类型和全局变量
我正在尝试遵循 this 等示例,但我遇到了很多错误,例如:
Unable to resolve ObjectType 'myType' : [Rule name='My Rule']
我的规则来自 app.drl,我的类型来自 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)
对我来说,您的示例按预期工作。所以我认为问题出在 configuration/dependencies 或您未提供的部分。
我可以提供工作示例 (spring+maven+junit5),而不是查看所有这些细节,它展示了如何从会话中插入和检索 drools 声明的类型。
请关注GitHub link.
特别test link.
使用 Drools 7.6.0(虽然我可以升级到更新的版本)。
我有一个由应用程序使用的核心库组成的系统。核心库在 common.drl 文件中定义了一些通用规则、类型和全局变量,然后应用程序在另一个 app.drl 文件中定义了一些附加规则、类型和全局变量。 app.drl 文件中的规则可以使用 common.drl.
中定义的类型和全局变量我正在尝试遵循 this 等示例,但我遇到了很多错误,例如:
Unable to resolve ObjectType 'myType' : [Rule name='My Rule']
我的规则来自 app.drl,我的类型来自 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)
对我来说,您的示例按预期工作。所以我认为问题出在 configuration/dependencies 或您未提供的部分。
我可以提供工作示例 (spring+maven+junit5),而不是查看所有这些细节,它展示了如何从会话中插入和检索 drools 声明的类型。
请关注GitHub link.
特别test link.