Я хочу создать основанное на времени правило, которое будет запускаться каждые 5 минут, и документация Drools гласит:
И наоборот, когда механизм Drools работает в пассивном режиме (т. Е. Вместо этого используется fireAllRulesof fireUntilHalt) по умолчанию не запускает последствия временных правил, если только fireAllRules не вызывается снова.Однако это поведение по умолчанию можно изменить, настроив KieSession с параметром TimedRuleExecutionOption, как показано в следующем примере
KieSessionConfiguration ksconf = KieServices.Factory.get().newKieSessionConfiguration();
ksconf.setOption( TimedRuleExecutionOption.YES );
KSession ksession = kbase.newKieSession(ksconf, null);
Однако я не обращаюсь к объекту KieSession напрямую, потому что я использую JavaREST API для отправки запросов в проект Drools, развернутый на KieExecution Server, как показано ниже (пример взят из документации Drools):
public class MyConfigurationObject {
private static final String URL = "http://localhost:8080/kie-server/services/rest/server";
private static final String USER = "baAdmin";
private static final String PASSWORD = "password@1";
private static final MarshallingFormat FORMAT = MarshallingFormat.JSON;
private static KieServicesConfiguration conf;
private static KieServicesClient kieServicesClient;
public static void initializeKieServerClient() {
conf = KieServicesFactory.newRestConfiguration(URL, USER, PASSWORD);
conf.setMarshallingFormat(FORMAT);
kieServicesClient = KieServicesFactory.newKieServicesClient(conf);
}
public void executeCommands() {
String containerId = "hello";
System.out.println("== Sending commands to the server ==");
RuleServicesClient rulesClient = kieServicesClient.getServicesClient(RuleServicesClient.class);
KieCommands commandsFactory = KieServices.Factory.get().getCommands();
Command<?> insert = commandsFactory.newInsert("Some String OBJ");
Command<?> fireAllRules = commandsFactory.newFireAllRules();
Command<?> batchCommand = commandsFactory.newBatchExecution(Arrays.asList(insert, fireAllRules));
ServiceResponse<ExecutionResults> executeResponse = rulesClient.executeCommandsWithResults(containerId, batchCommand);
if(executeResponse.getType() == ResponseType.SUCCESS) {
System.out.println("Commands executed with success! Response: ");
System.out.println(executeResponse.getResult());
} else {
System.out.println("Error executing rules. Message: ");
System.out.println(executeResponse.getMsg());
}
}
}
, поэтому я немного запутался, как передать эту функцию TimedRuleExecutionOptionсеанс?
Я уже нашел обходной путь, периодически отправляя команду FireAllRules, но я хотел бы знать, могу ли я настроить этот параметр сеанса, чтобы мне не приходилось добавлять периодический запуск для каждого таймерасобытие, которое я хочу создать.
Кроме того, я попытался использовать FireUntilHalt вместо FireAllRules, но, насколько я понимаю, эта команда блокирует поток выполнения на сервере, и мне нужно в какой-то момент отправить HaltCommand, всекоторого я хотел бы избежать, так как я чave многопоточный клиент, который отправляет события на сервер.