Автономный верблюд - конфигурация PropertiesComponent не работает на bean-объектах @ BeanInject - PullRequest
0 голосов
/ 10 мая 2019

Примечание. Вопрос касается автономного (с использованием основного класса) поведения невыпущенной версии 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

1 Ответ

1 голос
/ 11 мая 2019

Да, лучше иметь переопределение ENV, вы можете войти в JIRA и работать над github PR. Мы любим вклады http://camel.apache.org/support.html

Я зарегистрировал билет: https://issues.apache.org/jira/browse/CAMEL-13502

Хорошо, теперь этот режим реализован в качестве режима по умолчанию, и вы также можете настроить его из файла application.properties и т. Д .: https://github.com/apache/camel/blob/master/examples/camel-example-main/src/main/resources/application.properties#L23

И проблема с @PropertyInject также была исправлена, в Camel v3.0M3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...