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

标签 java drools

我通过 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/

相关文章:

java - 决策树和规则引擎 (Drools)

java - 流口水java更新

java - Drools 无法与 Spring Boot 一起正常工作

java - 静态最终字段的同步 getter

java - 无法在 OSX 上安装 R JavaGD 包

java - 如何在redhat linux中将JDK从Oracle升级到Zulu

java - Android BroadcastReceiver onReceive 在 MainActivity 中更新 TextView

java - 如何从结果/右侧获取条件/左侧中定义的所有 drools 变量的列表?

java - maven-jaxb2-plugin 在同一项目中重用公共(public) XSD

java - 如何在没有循环且仅使用foldLeft的情况下获得minVal?