gpt4 book ai didi

java - 在 Drools 的 LHS 中捕获异常

转载 作者:太空狗 更新时间:2023-10-29 22:47:46 24 4
gpt4 key购买 nike

我遇到一个问题,其中 drools 规则的 when 子句抛出 MethodNotFoundException。我正在寻找一种方法来确定它在运行时是哪条规则,以便能够将其从要使用的规则列表中删除。

规则示例

Rule "FooBar"
when
$V1 : Foo ( ) AND
$V2 : FooBar( ) from $V1.getGoodMethod() AND
$V3 : FooBarBar( status == "FooBar" ) from $V2.getBadMethod()
reply : FooFooBar()
then
reply.getList().add("FooBar");
end

因此,FooBar 上的getBadMethod 不存在。我想要一种方法来说明它是什么规则,并将其从要使用的规则列表中删除。

尝试过和失败的解决方案:

我已经尝试扩展 DefaultAgendaEventListener 并覆盖 beforeActivationFired 方法以将被触发的规则添加到列表中。我希望列表中的最后一个会引发错误,但遗憾的是它并没有那样解决。

我现在尝试在所有规则之前添加“始终为真”的规则。他们记录其后的规则名称。问题是当“WHEN”子句中出现异常时,不会记录任何内容。当发生上述异常时,就好像没有规则被触发。

问题都出在动态流口水生成代码上。我想采取一种双管齐下的方法来修复生成代码,并像本文中列出的那样捕获异常。

旁注:我会检查构建器中的错误。我没有收到来自以下代码的错误。

KnowledgeBuilderErrors errors = builder.getErrors();

if (!errors.isEmpty()) {
for (KnowledgeBuilderError error : errors) {
...
}
}

最佳答案

根据我的理解,在执行 fireAllRules() 方法之前应遵循以下步骤:

  1. 将规则添加到包/知识构建器
  2. 验证规则中没有错误
  3. 在工作内存中注入(inject)规则

当然,可以在没有第 2 步的情况下触发规则,但这种做法可能会导致问题中提到的问题。如果我是你,我会按照以下逻辑来解决你的这个问题:

第一步:

private RuleBase initialiseDrools() throws IOException, DroolsParserException {
PackageBuilder packageBuilder = readRules();
return addRulesToWorkingMemory(packageBuilder);
}

第 2 步:

private PackageBuilder readRules() throws DroolsParserException, IOException {
PackageBuilder packageBuilder = new PackageBuilder();
PackageBuilder intermPackageBuilder = null;

listOfReader = dynamicRuleReader(); // Here goes your application code

for(Reader reader : listOfReader){
try{
intermPackageBuilder = new PackageBuilder();
intermPackageBuilder.addPackage(reader);
assertNoRuleErrors(intermPackageBuilder); // This is the core step.
// Above line throws an exception, every time a rules fails. You can persist this exception for production debugging
packageBuilder.addPackage(reader);
}catch(DroolsParserException | IOException e){
logger.error("Rules contain error, so skip adding them to the Package Builder");
}
}

return packageBuilder;
}

第 3 步:

public void shouldFireAllRules() throws IOException, DroolsParserException {
RuleBase ruleBase = initialiseDrools();
WorkingMemory workingMemory = ruleBase.newStatefulSession();
int expectedNumberOfRulesFired = 2; // Idealy this number should be equal to the number of total rules injected in the Working memory

int actualNumberOfRulesFired = workingMemory.fireAllRules();

assertThat(actualNumberOfRulesFired, is(expectedNumberOfRulesFired));
}

使用上述方法,您不会执行有错误的规则,也不会出现上述情况。但是,我仍然认为您应该更多地关注生成错误规则的代码段,并且上述方法仅用于跟踪和持久化此类事件。

关于java - 在 Drools 的 LHS 中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500881/

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