Регистрация исключений при запуске правил с ConsequenceExceptionHandler - PullRequest
1 голос
/ 25 августа 2011

У меня есть сервер drools, настроенный через spring / camel, и я хотел бы иметь возможность регистрировать в файле все исключения времени выполнения, возникающие при запуске правил, а также подробные сведения о состоянии рабочей памяти во времяисключение.

Я обнаружил, что версия drools> = 5.2 из drools-spring позволяет настраивать собственный класс ConsequenceExceptionHandler в конфигурации пружины:

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

У меня возникли некоторые проблемы (некоторые из которых были связаны с переходом с drools 5.1 на 5.2), поэтому мне было интересно, если кто-нибудь делал запись исключений раньше и мог бы поделиться некоторыми деталями реализации.Или если кто-то может сказать мне, есть ли лучший способ добиться этого, чем с помощью специального обработчика исключений.

1 Ответ

4 голосов
/ 04 июня 2013

В моем проекте (я думаю, мне придется написать об этом в моем блоге http://toomuchcoding.blogspot.com, где у меня есть несколько статей о Drools), я написал собственный Listener следующим образом (я думаю, что нашел хорошийучебник здесь http://members.inode.at/w.laun/drools/CustomConsequenceExceptionHandlingHowTo.html)

Я определил свою Базу знаний как компонент в моем applicationContext:

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

}

Таким образом, при возникновении исключения вы получите произвольное сообщение по вашему выбору.

...