Примечание. Вопрос касается автономного (с использованием основного класса) поведения невыпущенной версии Camel 3.0.0-M2, которая имеет множество улучшений для автономного режима по сравнению с Camel 2.x - приведенный ниже код не предназначен для работы на Camel 2. х
Проблема: я заметил, что изменения в компоненте свойств, как описано в [1], не влияют на свойства конфигурации, внедренные в bean-компоненты. В моем случае я хочу установить для среды среды ПК переменную переопределения (по умолчанию используется запасной вариант).
В то время как переопределение действовало на маршруте, бобу вводили исходное значение свойства.
Свойство "hi" в application.properties установлено в "Hello", а переменная среды "hi" установлена в "Huhu", которая должна переопределять первый, когда environmentVariableMode имеет значение override (2).
При запуске:
System env var hi=Huhu
14:34:02.282 [Camel (camel-1) thread #2 - timer://foo] INFO route1 - Huhu from route
14:34:02.297 [Camel (camel-1) thread #2 - timer://foo] INFO route1 - Hello from bean
Код:
public class MyApplication {
private MyApplication() {
}
public static void main(String[] args) throws Exception {
Main main = new Main();
main.addConfigurationClass(MyConfiguration.class);
main.addRouteBuilder(MyRouteBuilder.class);
main.run(args);
}
}
public class MyConfiguration {
@BindToRegistry
public MyBean myBean(@PropertyInject("hi") String hi) {
return new MyBean(hi);
}
}
public class MyBean {
private String hi;
public MyBean(String hi) {
this.hi = hi;
}
public String hello() {
return hi + " from bean";
}
}
public class MyRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
CamelContext context = getContext();
PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class);
pc.setEnvironmentVariableMode(PropertiesComponent.ENVIRONMENT_VARIABLES_MODE_OVERRIDE); //default is FALLBACK
System.out.println("System env var hi=" + System.getenv("hi"));
from("timer:foo?repeatCount=1")
.log("${properties:hi} from route")
.bean("myBean")
.log("${body}");
}
}
application.properties:
hi = Hello
Единственный способ заставить его работать - это переопределить Main # postProcessCamelContext - действительно ли это так, как это было задумано? Или есть более идиоматический способ?
public class MyApplication extends Main {
private MyApplication(String[] args) throws Exception {
addConfigurationClass(MyConfiguration.class);
addRouteBuilder(MyRouteBuilder.class);
run(args);
}
@Override
protected void postProcessCamelContext(CamelContext camelContext) throws Exception {
PropertiesComponent pc = camelContext.getComponent("properties", PropertiesComponent.class);
pc.setEnvironmentVariableMode(PropertiesComponent.ENVIRONMENT_VARIABLES_MODE_OVERRIDE);
super.postProcessCamelContext(camelContext);
}
public static void main(String[] args) throws Exception {
new MyApplication(args);
}
}
Предложение для разработки Camel: Не имеет ли больше смысла устанавливать environmentVariableMode для переопределения по умолчанию, а не для отката, особенно когда речь идет о развертывании контейнера: переменные среды имеют приоритет над свойствами системы, которые имеют приоритет над конфигурацией приложения (например, приложения) .properties)
[1] https://github.com/apache/camel/blob/master/components/camel-properties/src/main/docs/properties-component.adoc