Сносит время выполнения правил через Java API - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу создать основанное на времени правило, которое будет запускаться каждые 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 многопоточный клиент, который отправляет события на сервер.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

pass "-Ddrools.timedRuleExecution = true" при запуске экземпляра сервера, на котором развернут kie-server.war.

0 голосов
/ 01 февраля 2019

Вы можете использовать функцию drools cron.Он действует как таймер и вызывает правило, основанное на выражении cron.Пример выполнения правила каждые 5 минут:

rule "Send SMS every 5 minutes"
    timer (cron:* 0/5 * * * ?)
when
    $a : Event( )
then

end

Вы можете найти объяснение здесь

...