Как динамически изменить правила данного сеанса Drools 6.3?
У меня есть сессия в Drools 6.3.x, содержащая несколько миллионов фактов.
Я создаю интерактивное приложение, которое, помимо прочего, позволяет пользователю фильтровать факты так, как он хочет. На мой взгляд, этот фильтр в основном шаблон. После того, как факты отфильтрованы, применяется логика для получения желаемого результата.
Из-за интерактивного характера приложения, я бы предпочел не ждать ввода пользователя для созданияKieBase
выведитеKieSession
Загрузите несколько миллионов фактов и постоянно применяйте правила.
В идеале я хотел бы создатьKieBase
содержащий логику приложения один раз, получитьKieSession
один раз, загрузите все факты один раз, и правила ввода / удаления на лету в зависимости от ввода пользователя. Как я могу сделать это в Drools 6.3? Я точно знаю, что это было возможно с Drools 5.
Некоторый код для контекстуализации моего вопроса. Этот фрагмент показывает, как настроить сеанс Drools:
KieHelper helper = new KieHelper();
String location = "/drools/logic.drl";
InputStream stream = getClass().getResourceAsStream(location);
Resource resource = ResourceFactory.newInputStreamResource(stream);
helper.addResource(resource, ResourceType.DRL);
Results results = helper.verify();
if (results.hasMessages(Message.Level.ERROR)) {
System.out.println(results.getMessages());
System.exit(0);
}
KieBase base = helper.build();
KieSession session = base.newKieSession();
for (Source source : sources) {
for (Object fact : source.getFacts()) {
session.insert(fact);
}
}
session.fireAllRules();
Насколько я вижу,KieBase
не предоставляет никаких способов добавления новых правил (только способы их удаления). Так что я не знаю, как перейти от следующего фрагмента, если не инициализироватьKieSession
с нуля...
String rule = "package boot\n" +
"\n" +
"rule \"Stamp\"\n" +
"when\n" +
"\t$o: Object()\n" +
"then\n" +
"\tSystem.out.println($o);\n" +
"end\n";
InputStream ruleStream = new ByteArrayInputStream(rule.getBytes());
Resource ruleResource = ResourceFactory.newInputStreamResource(ruleStream);
helper.addResource(ruleResource, ResourceType.DRL);
Любое предложение?