gpt4 book ai didi

java - 使用 ConsequenceExceptionHandler 触发规则时记录异常

转载 作者:行者123 更新时间:2023-11-29 03:54:23 29 4
gpt4 key购买 nike

我通过 spring/camel 配置了我的 drools 服务器,我希望能够将触发规则时发生的所有运行时异常记录到文件中,以及有关运行时工作内存状态的详细信息异常。

我发现 drools-spring 的 drools version >= 5.2 确实允许在 spring 配置中设置自定义 ConsequenceExceptionHandler 类:

https://issues.jboss.org/browse/JBRULES-2674

我遇到了一些麻烦(其中一些与从 drools 5.1 迁移到 5.2 有关)所以我想知道是否有人以前做过异常记录并可以分享一些实现细节。或者如果有人可以告诉我是否有比通过自定义异常处理程序更好的方法来实现这一点。

最佳答案

在我的项目中(我想我必须在我的博客 http://toomuchcoding.blogspot.com 上写下它,我有一些关于 Drools 的文章)我用以下方式写了一个自定义监听器(我想我在这里找到了一个很好的教程http://members.inode.at/w.laun/drools/CustomConsequenceExceptionHandlingHowTo.html )

我将我的知识库定义为我的 applicationContext 中的一个 bean:

<drools:kbase id="fxKBase">
<drools:resources>
<drools:resource type="DRL" source="classpath:path/first.drl"/>
<drools:resource type="DRL" source="classpath:path/second.drl"/>
</drools:resources>
<drools:configuration>
<drools:consequenceExceptionHandler handler="a.b.c.MyConsequenceExceptionHandler" />
</drools:configuration>
</drools:kbase>

然后我定义了MyConsequenceExceptionHandler

public class MyConsequenceExceptionHandler implements ConsequenceExceptionHandler {
@Override
public void handleException(Activation activation, WorkingMemory workingMemory, Exception exception) {
throw new MyConsequenceException(activation, workingMemory, exception);
}

和 MyConsequenceException:

public class MyConsequenceException extends RuntimeException {
private final WorkingMemory workingMemory;
private final Activation activation;

public MyConsequenceException(final Activation activation, final WorkingMemory workingMemory, final Exception exception) {
super(exception);
this.activation = activation;
this.workingMemory = workingMemory;
}

@Override
public String getMessage() {
StringBuilder sb = new StringBuilder( "Exception executing consequence for " );
if( activation != null && ( activation.getRule() ) != null ){
Rule rule = activation.getRule();
String ruleName = rule.getName();
sb.append("rule [\"").append( ruleName ).append( "\"]. " );
} else {
sb.append( "rule, name unknown" );
}
Throwable throwable = ExceptionUtils.getRootCause(getCause());
sb.append("The thrown exception is [").append(throwable).append("]. ");
return sb.toString();
}

@Override
public String toString() {
return getMessage();
}

这样,当抛出异常时,您将收到一条您选择的自定义消息。

关于java - 使用 ConsequenceExceptionHandler 触发规则时记录异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7185887/

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