Безопасно ли создавать сеансы Kie? - PullRequest
0 голосов
/ 10 апреля 2019

У нас есть некоторый код, который создает около 1500 сеансов Kie параллельно, и у меня сложилось впечатление, что он не является потокобезопасным.Я проверил весь наш код, который не содержит состояний, и последними недостающими частями в моей головоломке является следующий код:

public KieSession buildSession(Config configuration) throws InvalidConfigurationException {
    KieFileSystem kfs = this.kieServices.newKieFileSystem();

    addRules(config, kfs); // Stateless

    this.kieServices.newKieBuilder(kfs).buildAll();

    KieBaseConfiguration kieBaseConfiguration = KieServices.Factory.get().newKieBaseConfiguration();
    kieBaseConfiguration.setOption(EventProcessingOption.STREAM);

    KieContainer kieContainer = this.kieServices.newKieContainer(this.kieServices.getRepository().getDefaultReleaseId());
    KieBase kieBase = kieContainer.newKieBase(kieBaseConfiguration);

    return buildSession(configuration.getHouseholdId(), kieBase);
}

public KieSession buildSession(KieBase kieBase) {
    KieSessionConfiguration kieSessionConfiguration = KieServices.Factory.get().newKieSessionConfiguration();
    kieSessionConfiguration.setOption(ClockTypeOption.get("pseudo"));

    KieSession kieSession = kieBase.newKieSession(kieSessionConfiguration, null);

    return kieSession;
}

Мы добавляем правила в виде строк в файловую систему.Документация гласит:

However, since in this case the KieFileSystem doesn’t contain any pom.xml file (it is possible to add one using the KieFileSystem.writePomXML method though), Kie cannot determine the `ReleaseId` of the KieModule and assign to it a default one.
This default `ReleaseId` can be obtained from the KieRepository and used to identify the KieModule inside the KieRepository itself.

Так что я предполагаю, что в этом случае, поскольку у нас нет файлов pom в файловой системе, мы всегда будем использовать значение по умолчанию ReleaseId и иметь эквивалент временной переменнойкоторый используется для хранения модуля Kie.Тогда два потока могут переопределить эту переменную, что означает, что в некоторых случаях метод возвращает неправильный сеанс kie для конфигурации.

Это правильно?Если нет, как я могу это исправить?

...