1
votes

I want to load a drl file at runtime with high availability and versioning support.

The posts I've found work with older versions of Drools or with maven. Installing Maven on the docker pods won't be possible.

Related posts:

Drools 6.0 dynamically load rules at runtime

I need to add .drl files at runtime (From an S3 bucket) and supply it to drools rule engine

Ideas?

Thanks.

1

1 Answers

0
votes

Drools supports loading rules from files, one alternative that we are using in a similar use case is managing rules in a Git repo.

Component Start: Download the rules from git, and load them in a KieContainer.

Example:

    KieServices kieServices = KieServices.Factory.get();
    KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
    // Rule from string
    gitRulesDao.getAllRulesFilesFromGitLab().forEach(r -> {
        try {
            addRuleToKie(kieFileSystem, kieServices, fileSystemBaseUrl, r);
        } catch (IOException | GitLabApiException e) {
            e.printStackTrace();
        }
    });

    // build
    KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
    kieBuilder.buildAll();
    // Test rule
    Results results = kieBuilder.getResults();
    if (results.hasMessages(Message.Level.ERROR)) {
         ...
    }
    //
    KieModule kieModule = kieBuilder.getKieModule();
    return new 
    KieContainerLocal(kieServices.newKieContainer(kieModule.getReleaseId()));

Rules Changes: When the rules are modified a git webhook sends a message to a Message Queue and the suscribed components reload the rules.

KieContainerLocal is an structure that stores a KieContainer in memory.