Как создать источник данных с использованием верблюда?

Я только начал изучать Apache Camel. Я понял основы маршрутов и компонентов. Теперь я хочу попробовать подключиться к базе данных Oracle, прочитать записи из одной конкретной таблицы и записать эти записи в файл, используя File составная часть. Для чтения из базы данных я предполагаю, что мне нужно использовать JDBC компонент и дать dataSourceName,

Однако я не смог найти никакой информации о том, как создать источник данных с использованием верблюда. Вся информация, которую я нашел, связанная с этой темой, использует примеры Spring DSL. Я не использую Spring, и мне просто нужно проверить это с помощью простого автономного Java-приложения.

Я использую JDK7u25 с Apache Camel 2.12.1.

Может кто-нибудь, пожалуйста, опубликуйте образец для чтения из таблицы оракула и записи в файл?

[РЕДАКТИРОВАТЬ]

После проверки нескольких решений в Интернете я узнал о следующих двух подходах:

  1. Верблюд, чтобы бежать как самостоятельный. Вот мой код:

    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. Используя подход, упомянутый Клаусом Лбсеном. Вот код снова:

    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;
        }
    }
    

Но в обоих случаях я получаю ниже исключения:

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.

3 ответа

Решение

Так глупо я! Я не включил camel-jdbc-2.12.1.jar в CLASSPATH. Теперь вышеприведенные примеры работают.

Существует пример SQL, который показывает, как настроить DataSource

Да, что примеры с использованием Spring XML. Но то, как вы настраиваете DataSource, можно сделать и в коде Java. Затем вам нужно зарегистрировать источник данных в Camel Registry.

Например, вы можете использовать JndiRegistry или SimpleRegistry, Последнее проще.

Вот некоторый псевдокод, демонстрирующий принцип создания реестра, добавления компонентов в этот реестр и предоставления реестра конструктору DefaultCamelContext,

SimpleRegistry registry = new SimpleRegistry();

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

registry.put("myDataSource", ds);

CamelContext camel = new DefaultCamelContext(registry);

Spring упоминается там только потому, что это очень полезная парадигма работы с БД (в основном из-за шаблонов, представленных Spring Framework.) Конечно, вы можете подключить стандартное соединение JDBC и реализовать DAO самостоятельно - в этом нет ничего плохого.

Другие вопросы по тегам