gpt4 book ai didi

java - 如何在运行时在 Drools DRL 中将事实添加到工作内存并在无状态 session 的执行结果中检索它们?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:44:10 31 4
gpt4 key购买 nike

背景:

我正在开发一个应用程序,它根据一组 drools 规则将输入对象转换为两个输出对象之一。输出对象直到运行时才为人所知,它是在要执行的第一个规则中创建的。

这是创建输出对象的规则和示例转换规则:

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;
}

问题:

当我执行规则时,我没有在返回的事实中收到输出对象。我收到了交易对象,但我没有取回选项或交换对象,具体取决于第一条规则添加到工作内存中的对象。

问题:

如何在运行时在 drl 中将事实添加到工作内存并在无状态 session 的执行结果中检索它们?

编辑:我需要使用 drools 查询吗?

最佳答案

我继续使用 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();
}
}

关于java - 如何在运行时在 Drools DRL 中将事实添加到工作内存并在无状态 session 的执行结果中检索它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5872215/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com