camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Matt Raible <m...@raibledesigns.com>
Subject Overriding Properties
Date Fri, 08 Aug 2014 02:15:21 GMT
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
Mime
View raw message