Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 678
Jsmith Avatar asked Dec 01 '16 13:12

Jsmith


People also ask

How to read properties file in apache camel?

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

How do you buy a camel property?

From a Java route, you can use a processor where you can get hold of CamelContext where you can then call the getter for global options where you can then get the property you stored there.

What is endpoint in Apache Camel?

Camel supports the Message Endpoint pattern using the Endpoint interface. Endpoints are created by a Component and these endpoints are referred to in the DSL via their endpoint URIs.


2 Answers

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.

like image 145
Miloš Milivojević Avatar answered Oct 07 '22 20:10

Miloš Milivojević


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");
    }
}
like image 33
dimitrisli Avatar answered Oct 07 '22 20:10

dimitrisli