Hi

I logged a ticket to not forget about this
https://issues.apache.org/jira/browse/CAMEL-7699



On Mon, Aug 11, 2014 at 4:56 PM, Matt Raible <m...@raibledesigns.com> wrote:
> On Sat, Aug 9, 2014 at 2:47 AM, Claus Ibsen <claus.ib...@gmail.com> wrote:
>
>> Hi
>>
>> Yeah not sure if Spring Boot does stuff differently than regular
>> spring framework in term of the property placeholder stuff.
>>
>
> Yes, it does. From
> http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
> :
>
> Spring Boot uses a very particular PropertySource order that is designed to
> allow sensible overriding of values, properties are considered in the the
> following order:
>
> Command line arguments.
> Java System properties (System.getProperties()).
> OS environment variables.
> JNDI attributes from java:comp/env
> A RandomValuePropertySource that only has properties in random.*.
> Application properties outside of your packaged jar (application.properties
> including YAML and profile variants).
> Application properties packaged inside your jar (application.properties
> including YAML and profile variants).
> @PropertySource annotations on your @Configuration classes.
> Default properties (specified using SpringApplication.setDefaultProperties).
>
> It's also smart enough to know that a "ESB_ENV" environment variable should
> override a "esb.env" property.
>
>
>> Have you tried that spring -> camel bridge, there is a note about it
>> on the top of this page that points you to it
>> http://camel.apache.org/using-propertyplaceholder.html
>
>
> Yep, I have this in my CamelConfig.java:
>
> @Override
> protected void setupCamelContext(CamelContext camelContext) throws
> Exception {
> PropertiesComponent pc = new PropertiesComponent();
>  pc.setLocation("classpath:application.properties");
> camelContext.addComponent("properties", pc);
>  super.setupCamelContext(camelContext);
> }
>
>
>>
>>
>> And yeah if some code is missing to make this easier, then maybe we
>> can do something in camel-spring, or we could introduce a new
>> camel-spring-boot module that integrates the spring boot with Camel.
>> Maybe there is other spring boot stuff we need to take a look at.
>>
>>
>>
> I have a workaround, so this isn't urgent. However, it would be pretty
> sweet if Camel was smart enough to know about these overrides.
>
> This seems to be one of the main classes for making this work in Spring
> Boot:
>
> https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java
>
>
>>
>>
>> On Fri, Aug 8, 2014 at 4:15 AM, Matt Raible <m...@raibledesigns.com>
>> wrote:
>> > Hello all,
>> >
>> > In my Camel app, I recently integrated Spring Boot to use its external
>> configuration feature. Basically, I can put default properties in an
>> src/main/resources/application.properties file. Then I can override them on
>> different servers using various mechanisms, from using a
>> config/application.properties on the classpath to using environment
>> variables. It's really slick in that you can have a single WAR that can be
>> configured for dev, test, staging and prod.
>> >
>> > To read these properties in my Camel routes, I'm using the following
>> setupCamelContext() method to read this file in. Problem is, it doesn't
>> hook into Spring Boot's external override mechanism. Is there anyway to
>> make Camel aware of Spring Boot's override feature?
>> >
>> > @Configuration
>> > @ImportResource("classpath:META-INF/cxf/cxf.xml")
>> > @ComponentScan("com.company.app")
>> > public class CamelConfig extends CamelConfiguration {
>> >         @Value("${logging.trace.enabled}")
>> >         private Boolean tracingEnabled;
>> >
>> >         @Override
>> >         protected void setupCamelContext(CamelContext camelContext)
>> throws Exception {
>> >                 PropertiesComponent pc = new PropertiesComponent();
>> >                 pc.setLocation("classpath:application.properties");
>> >                 camelContext.addComponent("properties", pc);
>> >                 // see if trace logging is turned on
>> >                 if (tracingEnabled) {
>> >                         camelContext.setTracing(true);
>> >                 }
>> >                 super.setupCamelContext(camelContext);
>> >         }
>> >
>> >         @Bean
>> >         public Tracer camelTracer() {
>> >                 Tracer tracer = new Tracer();
>> >                 tracer.setTraceExceptions(false);
>> >                 tracer.setTraceInterceptors(true);
>> >                 tracer.setLogName("com.company.app.trace");
>> >                 return tracer;
>> >         }
>> > }
>> >
>> > If not, I'm able to workaround this issue by changing the properties
>> from being inlined to being separate Strings. For example, here's an
>> onException handler that doesn't pick up overridden properties:
>> >
>> > public abstract class AbstractRouteBuilder extends RouteBuilder {
>> >
>> >         /**
>> >          * Default exception handling for all routes.
>> >          *
>> >          * @throws Exception
>> >          */
>> >         @Override
>> >         public void configure() throws Exception {
>> >                 onException(Exception.class)
>> >                                 .setHeader("routeId",
>> property(Exchange.FAILURE_ROUTE_ID))
>> >                                 .setHeader("endpoint",
>> property(Exchange.FAILURE_ENDPOINT))
>> >                                 .setHeader("exception",
>> property(Exchange.EXCEPTION_CAUGHT))
>> >                                 .setHeader("subject", simple("Message
>> Broker Error ({{esb.env}}) - ${exception.class.simpleName}"))
>> >
>> .transform(simple("${exception.message}\n\nStacktrace
>> Details:\n\n${exception.stacktrace}"))
>> >
>> .to("freemarker:/templates/mail/error.ftl")
>> >
>> .to("smtp://{{mail.host}}?contentType=text/plain&to={{esb.alert.email}}" +
>> >
>> "&from={{mail.from}}&subject=${headers.subject})");
>> >         }
>> > }
>> >
>> > If I change it to the following, things work as expected:
>> >
>> > public abstract class AbstractRouteBuilder extends RouteBuilder {
>> >
>> >         @Value("${esb.env}")
>> >         private String esbEnv;
>> >
>> >         @Value("${esb.alert.email}")
>> >         private String esbAlertEmail;
>> >
>> >         /**
>> >          * Default exception handling for all routes.
>> >          *
>> >          * @throws Exception
>> >          */
>> >         @Override
>> >         public void configure() throws Exception {
>> >                 onException(Exception.class)
>> >                                 .setHeader("routeId",
>> property(Exchange.FAILURE_ROUTE_ID))
>> >                                 .setHeader("endpoint",
>> property(Exchange.FAILURE_ENDPOINT))
>> >                                 .setHeader("exception",
>> property(Exchange.EXCEPTION_CAUGHT))
>> >                                 .setHeader("subject", simple("Message
>> Broker Error (" + esbEnv + ") - ${exception.class.simpleName}"))
>> >
>> .transform(simple("${exception.message}\n\nStacktrace
>> Details:\n\n${exception.stacktrace}"))
>> >
>> .to("freemarker:/templates/mail/error.ftl")
>> >
>> .to("smtp://{{mail.host}}?contentType=text/plain&to=" + esbAlertEmail +
>> >
>> "&from={{mail.from}}&subject=${headers.subject})");
>> >         }
>> > }
>> >
>> > However, I'd rather not have to do this for each route.
>> >
>> > Please let me know if it's possible to make Camel aware of Spring Boot's
>> external properties configuration.
>> >
>> > Thanks,
>> >
>> > Matt
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> Red Hat, Inc.
>> Email: cib...@redhat.com
>> Twitter: davsclaus
>> Blog: http://davsclaus.com
>> Author of Camel in Action: http://www.manning.com/ibsen
>> hawtio: http://hawt.io/
>> fabric8: http://fabric8.io/
>>



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
Email: cib...@redhat.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
hawtio: http://hawt.io/
fabric8: http://fabric8.io/

Reply via email to