我可以将drools .drl文件存储在bitbucket存储库中,并在运行期间使用Spring Boot访问它们

时间:2019-01-04 21:54:29

标签: spring spring-boot drools

我想将drools .drl文件存储在bitbucket中(而不是将它们保存在应用程序类路径中),并在使用Spring Boot期间访问它们。这样,如果规则有任何更改,我就不需要重新打包应用程序并重新部署。

1 个答案:

答案 0 :(得分:2)

默认情况下,Bean是单例的,因此仅创建一次即可。我还没有亲自与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 bean的,但是我的假设是您很可能会传入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
        }
    }
}