Я новичок в Drools. Я хочу отложить 5 секунд после того, как я уволил правило (и только один раз). Итак, я использую timer (int: 5s) для этого. Но я обнаружил, что после выполнения правила консольное приложение никогда не будет прекращено, и его процесс javaw.exe все еще существует в моем диспетчере задач. Единственный способ - вызвать ksession.dispose(). Но это неприемлемо, потому что трудно найти этот ksession в нашем кластерном архитекторе.Сценарий правила таймера, основанного на тайм-аутах, всегда находится в памяти и вызывает утечку памяти
Итак, есть ли способ сделать ksession автоматически удаленным после выполнения правила?
Вот мой простой тест:
главный класс
public class App { public static void main(String[] args) { System.out.println("Started..."); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(new ClassPathResource("Timer.drl", App.class), ResourceType.DRL); KnowledgeBase kbase = kbuilder.newKnowledgeBase(); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.fireAllRules(); System.out.println("Ended"); } }
DRL файл
package myDrools.TimerTest1 rule "Your First Rule" timer(int:5s) when eval(true) then System.out.println("Finished"); end
Выход будет:
Started... Ended Finished
Но мое консольное приложение никогда не будет прекращено. Здесь что-то не так? Я тестировал его как в Drools 5.6.0 Final, так и в 6.4.0 Final. Тем не менее, у обоих из них есть одна и та же проблема. Я думаю, что ksession должен быть удален, поскольку таймер (int: 5s) не является интервальным таймером.
Привет Laune, Спасибо вам за ответ. Для этого решения существует проблема. Если когда часть не соответствует действительности, drools.halt() не пострадает. Итак, есть ли что-то вроде finally, чтобы убедиться, что drools.halt() можно запустить? – capcom923
У меня есть не очень хорошее решение, которое нужно использовать do [abc], затем ...то [abc] – capcom923
Возможно, безусловное правило с таймером (int: 6s) (6 = 5 + 1) будет самым простым решением :-) – laune