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