Drools Версия 7.12.0. Финал
Я пытаюсь динамически загрузить файл DRL и определение класса в механизм Drools, но получаю ошибку при разрешении типа класса.Я смог сузить ошибку, и ее можно воссоздать с помощью следующего кода groovy.
// 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 способен получать доступ к моему бину и фильтровать его (часть «когда» в строке моего правила),Это можно показать, удалив строку test.setFired(true);
в myRuleString
.Если эта строка удалена, все работает нормально, и выводится «правило сработало».
Проблема в том, что объект «тест» не может быть решен нигде в движке Drools как экземпляр класса com.example.drools.dynamic.HelloWorld