Могу ли я хранить файлы drools .drl в репозитории bitbucket и получать к ним доступ во время выполнения с помощью весенней загрузки - PullRequest
0 голосов
/ 05 января 2019

Я хотел бы хранить файлы drools .drl в bitbucket (вместо того, чтобы хранить их внутри пути к классам приложения) и обращаться к ним во время использования весенней загрузки. Таким образом, если есть какие-либо изменения в правилах, мне не нужно перепаковывать приложение и повторно развертывать.

1 Ответ

0 голосов
/ 05 января 2019

Бины по умолчанию являются одноэлементными, поэтому они создаются только один раз и все. Я не работал с Drools лично, но выполнение HTTP-запросов только для получения файла могло бы быть дорогостоящим / медленным.

Так что я бы предложил попробовать как-нибудь использовать Spring Cloud Config и сохранить там свои правила в application.yml

Так, например, вы должны определить следующее в вашем Git Spring config repo :

drools:
  myRule: >
    package com.baeldung.drools.rules;

    import com.baeldung.drools.model.Applicant;

    global com.baeldung.drools.model.SuggestedRole suggestedRole;

    dialect  "mvel"

    rule "Suggest Manager Role"
        when
            Applicant(experienceInYears > 10)
            Applicant(currentSalary > 1000000 && currentSalary <= 
            2500000)
        then
            suggestedRole.setRole("Manager");
    end

Затем вы бы определили ConfigurationProperties bean, например:

@Configuration
@ConfigurationProperties("drools")
public class ConfigProperties {
    private String myRule;

    // getters/setters ...
}

Поскольку мы собираемся использовать Spring Cloud Config, вам нужно добавить @RefreshScope

@Configuration
@ConfigurationProperties("drools")
@RefreshScope
public class ConfigProperties {
    private String myRule;

    // getters/setters ...
}

Так что теперь, когда вы вносите изменения в конфигурационное хранилище, оно должно отражаться в вашем приложении без необходимости повторного развертывания с обновленными файлами.

Я не знаю, как вы строите свой бин Drool, но я предполагаю, что вы, вероятно, передаете InputStream, так просто преобразуйте String в InputStream:

@Configuration
public class MyDroolConfig {
    private final ConfigProperties properties;

    ConfigProperties(ConfigProperties properties) {
        this.properties = properties;
    }

    @Bean
    public MyRuleObject myRuleObject() {
        try (InputStream in = new ByteArrayInputStream(properties.getMyRule().getBytes())) {
            // do something with the rule
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...