У меня проблема, когда предложение when правила drools генерирует 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
Итак, getBadMethod на FooBar не существует. Я хотел бы узнать, что это такое, и удалить его из списка правил для использования.
Пробованные и неудачные решения:
Я попытался расширить DefaultAgendaEventListener и переопределить метод beforeActivationFired, чтобы добавить правило, запущенное в список. Я надеялся, что последний в списке будет тем, кто выбросил ошибку, но, к сожалению, это не получилось.
Теперь я попытался добавить правила "всегда истинные" перед всеми моими правилами. Они записывают имя правила, которое появляется после него. Проблема заключается в том, что в предложении WHEN отсутствует исключение, и ничего не регистрируется. Как будто никакие правила не срабатывают, когда возникает исключение, такое как выше.
Все проблемы связаны с динамическим кодом генерации слюни. Я хотел бы использовать два подхода к исправлению кода генерации и перехватывать исключения, подобные тем, которые перечислены в этом сообщении.
Примечание: Я проверяю ошибки в построителе. Я не получаю ошибок из приведенного ниже кода.
KnowledgeBuilderErrors errors = builder.getErrors();
if (!errors.isEmpty()) {
for (KnowledgeBuilderError error : errors) {
...
}
}