how to create datasource using camel?

2020-06-03 11:00发布

问题:

I have just started learning Apache Camel. I understood the basics of Routes and Components. Now I want to give a try by connecting to Oracle database, reading records from one particular table and write those records to a file using File component. To read from database I assume I need to use JDBC component and give the dataSourceName.

However, I couldn't find any info on how to create a dataSource using camel. All info that I found related to this topic uses Spring DSL examples. I don't use Spring and I just need to test this using simple standalone Java application.

I am using JDK7u25 with Apache Camel 2.12.1.

Can someone please post a sample to read from the oracle table and write to a file?

[EDIT]

After checking several solutions on the web, I came to know about following two approaches:

  1. Camel to run as standalone. Here is my code:

    import javax.sql.DataSource;    
    import org.apache.camel.main.Main;
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.commons.dbcp.BasicDataSource;
    
    public class JDBCExample {
    
        private Main main;
    
        public static void main(String[] args) throws Exception {
            JDBCExample example = new JDBCExample();
            example.boot();
        }
    
        public void boot() throws Exception {
            // create a Main instance
            main = new Main();
            // enable hangup support so you can press ctrl + c to terminate the JVM
            main.enableHangupSupport();
    
            String url = "jdbc:oracle:thin:@MYSERVER:1521:myDB";
            DataSource dataSource = setupDataSource(url);
    
            // bind dataSource into the registery
            main.bind("myDataSource", dataSource);
    
            // add routes
            main.addRouteBuilder(new MyRouteBuilder());
    
            // run until you terminate the JVM
            System.out.println("Starting Camel. Use ctrl + c to terminate the JVM.\n");
            main.run();
        }
    
        class MyRouteBuilder extends RouteBuilder {
            public void configure() {
                String dst = "C:/Local Disk E/TestData/Destination";
                from("direct:myTable")
                   .setBody(constant("select * from myTable"))
                   .to("jdbc:myDataSource")
                    .to("file:" + dst);
            }
        }
    
        private DataSource setupDataSource(String connectURI) {
            BasicDataSource ds = new BasicDataSource();
            ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
            ds.setUsername("sa");
            ds.setPassword("devon1");
            ds.setUrl(connectURI);
            return ds;
        }
    }
    
  2. Using the approach mentioned by Claus lbsen. Here is the code again:

    import javax.sql.DataSource;
    import org.apache.camel.CamelContext;
    import org.apache.camel.impl.DefaultCamelContext;
    import org.apache.camel.impl.SimpleRegistry;
    import org.apache.camel.main.Main;
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.commons.dbcp.BasicDataSource;
    
    public class JDBCExample {
    
        private Main main;
    
        public static void main(String[] args) throws Exception {
            String url = "jdbc:oracle:thin:@MYSERVER:1521:myDB";
            DataSource dataSource = setupDataSource(url);
    
            SimpleRegistry reg = new SimpleRegistry() ;
            reg.put("myDataSource",dataSource);
    
            CamelContext context = new DefaultCamelContext(reg);
            context.addRoutes(new JDBCExample().new MyRouteBuilder());
            context.start();
            Thread.sleep(5000);
            context.stop();
        }
    
        class MyRouteBuilder extends RouteBuilder {
            public void configure() {
                String dst = "C:/Local Disk E/TestData/Destination";
                from("direct:myTable")
                   .setBody(constant("select * from myTable"))
                   .to("jdbc:myDataSource")
                    .to("file:" + dst);
            }
        }
    
        private static DataSource setupDataSource(String connectURI) {
            BasicDataSource ds = new BasicDataSource();
            ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
            ds.setUsername("sa");
            ds.setPassword("devon1");
            ds.setUrl(connectURI);
            return ds;
        }
    }
    

But in both the cases I am getting below exception:

Caused by: org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: jdbc://myDataSource due to: No component found with scheme: jdbc
    at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:534)
    at org.apache.camel.util.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:63)
    at org.apache.camel.model.RouteDefinition.resolveEndpoint(RouteDefinition.java:192)
    at org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:106)
    at org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:112)
    at org.apache.camel.model.SendDefinition.resolveEndpoint(SendDefinition.java:61)
    at org.apache.camel.model.SendDefinition.createProcessor(SendDefinition.java:55)
    at org.apache.camel.model.ProcessorDefinition.makeProcessor(ProcessorDefinition.java:500)
    at org.apache.camel.model.ProcessorDefinition.addRoutes(ProcessorDefinition.java:213)
    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:909)
    ... 12 more
[Thread-0] INFO org.apache.camel.main.MainSupport$HangupInterceptor - Received hang up - stopping the main instance.

回答1:

There is the SQL example which shows how to setup a DataSource

  • http://camel.apache.org/sql-example.html

Yes that examples using Spring XML. But how you setup the DataSource can be done in Java code also. Then you need to register the DataSource in the Camel Registry.

For example you can use a JndiRegistry or the SimpleRegistry. The latter is easier.

Here is some pseudo code showing the principle, of creating a registry, add your beans into this registry, and then providing the registry to the constructor of DefaultCamelContext.

SimpleRegistry registry = new SimpleRegistry();

// code to create data source here
DateSource ds = ...

registry.put("myDataSource", ds);

CamelContext camel = new DefaultCamelContext(registry);


回答2:

So silly me! I had not included camel-jdbc-2.12.1.jar in the CLASSPATH. Now above examples work.



回答3:

Spring was mentioned there just because it is very useful paradigm of working with DB (mainly because of templates introduced by Spring Framework.) Of course you can hook up the standard JDBC connection and implement DAO by yourself - nothing wrong with that.