Запустите правила на основе drools в другом приложении, используя отражение - PullRequest
0 голосов
/ 28 июня 2019

У нас есть основное приложение, написанное на java, которое строит некоторые из его зависимостей от времени выполнения, используя отражение.Зависимости строятся с использованием maven, и создается большой толстый jar, который содержит все файлы классов java (.class), файлы ресурсов и т. Д. (Включая файлы drools)

Эти зависимости имеют правила, написанные в drools, и мы хотимчтобы выполнить эти правила на ходу из основного приложения.

Я попытался запустить файл правил в одной из зависимостей, но получил исключительную ситуацию во время выполнения при создании экземпляра kiemodule.

Файл правил:

Вызывает статическую функцию для проверки, является ли переданная строка пустой или нет.


import static com.xxx.Utils.isEmpty;

rule "Hello World"
    when
        eval(isEmpty(""))
    then
        System.out.println("Called a method");
end

Основное приложение:

Загрузка класса: мы используем загрузчик пользовательского класса длязагрузить классы из репозитория Nexus.


public class CustomClassLoader extends URLClassLoader {

    public CustomClassLoader(URL url, ClassLoader parent) {
        super(new URL[]{ url }, parent);
    }

    @Override
    public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        return super.loadClass(name, resolve);
    }
}


Обработчик правил:


public void initialiseKieContainer() throws IOException {
        KieServices kieServices = KieServices.Factory.get();

        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        for(Resource file : getRuleFiles()) {
            kieFileSystem.write(ResourceFactory.newClassPathResource("rules/" + file.getFilename(), classLoader);   

// classLoader is the instance of CustomClassLoader used to load the jar containing the rules file.

        }

        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
        kieBuilder.buildAll();

        KieModule kieModule = kieBuilder.getKieModule();

        this.kContainer = kieServices.newKieContainer(kieModule.getReleaseId());
    }

    /***
     * returns rule files from resources
     * @return
     * @throws IOException
     */
    private Resource[] getRuleFiles() throws IOException {
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        return resourcePatternResolver.getResources("rules/rule.drl");
    }

Когда я запускаю этот файл, я ожидаю, что правило должно быть выполнено, и я должен получить "Вызываетсяметод ", но я получаю это исключение:


java.lang.RuntimeException: Unable to get KieModule, Errors Existed: Error Messages:
Message [id=1, kieBase=defaultKieBase, level=ERROR, path=rules/rule.drl, line=3, column=0
   text=Rule Compilation error Only a type can be imported. com.xxx.Utils.isEmpty resolves to a package
The method isEmpty(String) is undefined for the type Rule_Hello_World174429295]

...