Слюни, инициализированные из базы данных, пустыJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Слюни, инициализированные из базы данных, пусты

Сообщение Anonymous »

Мне удалось использовать Drools для классификации транзакций, когда правила хранились в виде файла в папке ресурсов. Но мне нужен CRUD API, поэтому я начал загружать правила из базы данных. Я провел день, но ни одна транзакция не была классифицирована, и я думаю, что это из-за неправильной конфигурации.
gradle:

Код: Выделить всё

droolsVersion = '8.44.0.Final'
implementation ("org.drools:drools-ruleunits-engine:${droolsVersion}")
implementation ("org.kie:kie-ci:${droolsVersion}")
implementation ("org.drools:drools-xml-support:${droolsVersion}")
Компонент конфигурации Drools

Код: Выделить всё

@Component
public class DroolsConfig {
private final DroolsService droolsService;
private final KieServices kieServices;
private final KieFileSystem kieFileSystem;
private KieContainer kieContainer;
private KieBase kieBase;

public DroolsConfig(DroolsService droolsService) {
this.droolsService = droolsService;
kieServices = KieServices.Factory.get();
kieFileSystem = kieServices.newKieFileSystem();
buildInitialKieBase();
}

private void buildInitialKieBase() {
kieContainer = droolsService.loadRulesFromDatabase(kieServices, kieFileSystem);
kieBase = kieContainer.getKieBase();
}
}
Служба инициализации Drools

Код: Выделить всё

@Service
public class DroolsService {
@Autowired private final DroolsRuleRepository ruleRepository;

public KieContainer loadRulesFromDatabase(KieServices kieServices, KieFileSystem kieFileSystem) {
List rules = ruleRepository.findByActive(true);
log.info("Found {} active rules", rules.size());
for (DroolsRule rule : rules) {
kieFileSystem.write("/rules/global/" + rule.getId() + ".drl", rule.getContent());
}

KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
log.info("Rules compiled with following messages: {}", kieBuilder.getResults().getMessages());
for (Message message : kieBuilder.getResults().getMessages(Message.Level.ERROR)) {
System.out.println("Error in rule file: " + message.getText());
}

if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) {
throw new IllegalStateException("Errors while building rules: " + kieBuilder.getResults());
}

return kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
}
}
Исполнитель правил

Код: Выделить всё

@Service
public class RuleExecutorService {
private final DroolsConfig droolsConfig;
private final TransactionCategorizationService categorization;

private StatelessKieSession kieSession;

@PostConstruct
private void initializeSession() {
refreshSession();
}

public void refreshSession() {
log.info("Creating a new Kie session");
var kieContainer = droolsConfig.getKieContainer();
kieSession = kieContainer.newStatelessKieSession();
kieSession.setGlobal("TOOLS", categorization);
KieBase kieBase = kieSession.getKieBase();
for (KiePackage kiePackage : kieBase.getKiePackages()) {
for (Rule rule : kiePackage.getRules()) {
System.out.println("Rule: " + rule.getName());
}
}
}

public void executeRules(Transaction transaction) {
log.info("Executing rules for transaction {}", transaction.getBankReference());
kieSession.execute(transaction);
log.info("Rules executed");
}
Одно правило

Код: Выделить всё

rule "Tesco transactions"
salience 10
activation-group "shopIdentification"
when
$t : Transaction(transactionType == null && TOOLS.containsText($t, "Tesco"))
then
$t.setMerchant("Tesco");
$t.setExpenseCategory("FOOD");
$t.setTransactionType(TransactionType.EXPENSE);
end
Maven настроен (M2_HOME). Я проверил, что правила загружаются из базы данных. Ошибки компиляции нет. Я даже добавил прослушиватель в KieStatelessSession, но он так и не был вызван. Когда я пытаюсь проверить KieBase, он кажется пустым, но KieFileSystem содержит файлы из базы данных.
Журналы:

Код: Выделить всё

INFO c.l.a.s.DroolsService [restartedMain] Loading rules from database
INFO c.l.a.s.DroolsService [restartedMain] Found 14 active rules
WARN o.d.c.k.b.i.AbstractKieProject [restartedMain] No files found for KieBase defaultKieBase
INFO c.l.a.s.DroolsService [restartedMain] Rules compiled with following messages: []
INFO o.d.c.k.b.i.KieContainerImpl [restartedMain] Start creation of KieBase: defaultKieBase
INFO o.d.c.k.b.i.KieContainerImpl [restartedMain] End creation of KieBase: defaultKieBase
INFO c.l.a.s.RuleExecutorService [restartedMain] Creating a new Kie session
Думаю, третья строка указывает на проблему.

Подробнее здесь: https://stackoverflow.com/questions/793 ... e-is-empty
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»