11

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.
ohaal
  • 5,208
  • 2
  • 34
  • 53
ParagJ
  • 1,566
  • 10
  • 38
  • 56
  • Hey Parag, I have similar requirement, I am using same code base as you posted but I am not getting anything in path mentioned.any changes is required on same code? I checked my Datasource and connection is established. Please help. if required i will post my code. – Jayesh Jan 03 '15 at 13:47
  • Trying the second example, on the reg.put.. line, I'm getting "The method put(String, Map,Object>) in the type HashMap,Object>> is not applicable for the arguments (String, DataSource)" – NathanH Apr 15 '22 at 14:45

3 Answers3

8

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

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);
Claus Ibsen
  • 56,060
  • 7
  • 50
  • 65
  • lbsen: Thanks for the info. Yes, I tested with that using SimpleRegistry but I am getting an exception. Please see the question, I have updated it. – ParagJ Oct 14 '13 at 11:31
  • You need to add camel-jdbc JAR to the classpath, and the dependencies from camel-jdbc. If you use Maven that is easy, if not, then you may need to download and add more JARs manually. – Claus Ibsen Oct 14 '13 at 13:22
  • For OSGI users - feature:install camel-jdbc – Mikro Koder Sep 06 '17 at 14:19
  • I'm getting an error "The method put(String, Map,Object>) in the type HashMap,Object>> is not applicable for the arguments (String, DataSource)" .. and I have no idea what that means. – NathanH Apr 15 '22 at 14:43
2

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

ParagJ
  • 1,566
  • 10
  • 38
  • 56
0

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.

aviad
  • 8,229
  • 9
  • 50
  • 98