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

时间:2011-08-25 06:16:04

标签: java drools

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

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

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

我遇到了一些问题(其中一些问题与从drools 5.1迁移到5.2有关)所以我想知道是否有人之前已经完成了异常记录,并且可以分享一些实现细节。或者,如果有人可以通过自定义异常处理程序告诉我是否有更好的方法来实现此目的。

1 个答案:

答案 0 :(得分:4)

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

我在我的applicationContext中将我的KnowledgeBase定义为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();
} 

}

通过这种方式,当抛出异常时,您将获得您选择的自定义消息。