[英]How do I add facts to working memory at runtime in the Drools DRL and retrieve them in the execution results of a stateless session?
背景:
我正在开发一个应用程序,该应用程序根据一组 drools 规则将输入 object 转换为两个 output 对象之一。 output object 直到运行时才知道,它是在第一个要执行的规则中创建的。
以下是创建 output object 的规则和示例转换规则:
rule "Initialization"
dialect "java"
salience 1000
no-loop true
when
t : Trade()
then
if(t.getTran().getInsType().equalsIgnoreCase("EEO") ||
t.getTran().getInsType().equalsIgnoreCase("EEF"))
{
insert(new Option());
}
else
{
insert(new Swap());
}
end
rule "Example Rule"
dialect "java"
when
t : Trade()
opt : Option()
then
opt.setCounterpartyName(t.getTran().getCParty());
end
这是调用规则的代码:
private void test(){
for(File xmlFile : getXmlFilesFromDirectory(XML_DIRECTORY))
{
Trade trade = (Trade)unmarshall(xmlFile, Trade.class);
KnowledgeBase kbase = readKnowledgeBase();
StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
List<Command> commands = new ArrayList<Command>();
commands.add(CommandFactory.newInsert(trade, "trade"));
commands.add(CommandFactory.newFireAllRules());
ExecutionResults results = ksession.execute(CommandFactory.newBatchExecution(commands));
logger.close();
}
}
private static KnowledgeBase readKnowledgeBase() throws Exception
{
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("security-transformation.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0)
{
for (KnowledgeBuilderError error: errors)
{
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
问题:
当我执行规则时,我在返回的事实中没有收到 output object。 我收到交易 object 回来,但我没有取回选项或交换 object,这取决于第一条规则添加到工作 memory 中。
问题:
如何在运行时在 drl 中将事实添加到工作 memory 并在无状态 session 的执行结果中检索它们?
编辑:我需要使用流口水查询吗?
我继续使用drools 查询。 我会为其他出现的人发布代码。
查询添加到上述规则(对象扩展BaseTrade
):
query "GetOutputObj"
baseTrade: BaseTrade()
end
从执行结果中检索查询结果的代码:
StatelessKnowledgeSession ksession = this.kbase.newStatelessKnowledgeSession();
KnowledgeRuntimeLogger klogger = configureKnowledgeRuntimeLogger(ksession);
List<Command> commands = new ArrayList<Command>();
commands.add(CommandFactory.newInsert(inputObj, "inputObj"));
commands.add(CommandFactory.newFireAllRules());
commands.add(CommandFactory.newQuery("outputObj", "GetOutputObj"));
ExecutionResults results = ksession.execute(CommandFactory.newBatchExecution(commands));
QueryResults queryResults = ((NativeQueryResults)results.getValue("baseTrade")).getResults();
try
{
Iterator iter = queryResults.iterator();
while(iter.hasNext())
{
QueryResult result = iter.next();
//There can be only one... just like Highlander
//Could switch this up and return a list, but we only expect one thing from here.
return (BaseTrade) result.get("baseTrade");
}
}
finally
{
if(klogger != null)
{
klogger.close();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.