Бины по умолчанию являются одноэлементными, поэтому они создаются только один раз и все. Я не работал с 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
}
}
}