Jsmith
Jsmith

Reputation: 360

Camel read properties file

How do I configure the use of a properties file using Java DSL and the Main object?

According to this page I should be able to call something like:

main.setPropertyPlaceholderLocations("example.properties");

However that simply doesn't work. It seems that option wasn't added until Camel 2.18 and I'm running 2.17.1.

What was the original way to set a properties file to use when letting the application run in a standalone form?

Some backstory:

I'm trying to convert from Spring to Java DSL. During that conversion I was attempting to have my Camel application run on its own. I know that is achieved using main.run();.

I had things "functioning" when using the CamelContext, but that cannot run on its own. So I know using the following will work in that case:

PropertiesComponent pc = new PropertiesComponent();
pc.setLocation("classpath:/myProperties.properties");
context.addComponent("properties", pc);

Is there some way I can tell the main to use that setup? Or is there something else needed?

Upvotes: 5

Views: 6660

Answers (2)

dimitrisli
dimitrisli

Reputation: 21391

Since you are mentioning you are in the process to move from Spring XML to Java Config here's a minimum application that is using properties and injecting it into a Camel route (it's really properties management in Spring injected into our Camel route bean):

my.properties:

something=hey!

Main class:

package camelspringjavaconfig;

import org.apache.camel.spring.javaconfig.CamelConfiguration;
import org.apache.camel.spring.javaconfig.Main;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@ComponentScan("camelspringjavaconfig")
@PropertySource("classpath:my.properties")
public class MyApplication extends CamelConfiguration {

    public static void main(String... args) throws Exception {
        Main main = new Main();
        main.setConfigClass(MyApplication.class);  // <-- passing to the Camel Main the class serving as our @Configuration context
        main.run();   // <-- never teminates
    }
}

MyRoute class:

package camelspringjavaconfig;

import org.apache.camel.builder.RouteBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class MyRoute extends RouteBuilder {

    @Autowired
    Environment env;   //<-- we are wiring the Spring Env

    @Override
    public void configure() throws Exception {

        System.out.println(env.getProperty("something"));  //<-- so that we can extract our property

        from("file://target/inbox")
                .to("file://target/outbox");
    }
}

Upvotes: 1

Miloš Milivojević
Miloš Milivojević

Reputation: 5369

You can use the following snippet:

PropertiesComponent pc = new PropertiesComponent();
pc.setLocation("classpath:/myProperties.properties");
main.getCamelContexts().get(0).addComponent("properties", pc);

Also, if you are using camel-spring, you could use org.apache.camel.spring.Main class, it should use the property placeholder from your application context.

Upvotes: 3

Related Questions