У нас есть некоторый код, который создает около 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 для конфигурации.
Это правильно?Если нет, как я могу это исправить?