Drools版本7.12.0.Final
我试图将DRL文件和类定义动态加载到Drools引擎中,但是在解析类类型时遇到错误。我能够缩小错误范围,可以使用以下常规代码重新创建该错误。
// Define class as string
def path = "com.example.drools.dynamic"
def name = "HelloWorld"
def classDef = """
package ${path}
class ${name} {
String hello
boolean fired
}
"""
// Parse class into loader and create an instance
def loader = new GroovyClassLoader()
def myClass = loader.parseClass(classDef)
def bean = myClass.newInstance()
bean.setHello("hello")
bean.setFired(false)
// Rule as string
def myRuleString = """
import ${path}.*;
rule 'test rule'
when
test: ${name}(hello == 'hello')
then
System.out.println('rule fired');
test.setFired(true);
end
"""
// Build Drools
def kieServices = KieServices.Factory.get()
def kfs = kieServices.newKieFileSystem()
kfs.write("src/main/resources/dynamicRules.drl", kieServices.getResources().newReaderResource(new StringReader(myRuleString)))
def kieBuilder = kieServices.newKieBuilder(kfs, loader).buildAll()
def kieContainer = kieServices.newKieContainer(kieBuilder.getKieModule().getReleaseId())
def kieSession = kieContainer.newKieBase(kieServices.newKieBaseConfiguration()).newStatelessKieSession()
// Run Drools
def kieCommandFactory = kieServices.getCommands()
def commands = [
kieCommandFactory.newInsert(bean),
kieCommandFactory.newFireAllRules("outFired")
]
def execResults = kieSession.execute(kieCommandFactory.newBatchExecution(commands))
drools引擎能够访问和过滤我的bean(我的规则字符串中的“何时”部分)。可以通过删除test.setFired(true);
中的行myRuleString
来显示。如果删除此行,则一切正常,并显示“ rule fired”。
问题在于,无法在Drools引擎中的任何地方将对象“ test”作为com.example.drools.dynamic.HelloWorld类的实例进行解析