2013-10-14 5 views
7

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

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

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

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

[EDIT]

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

  1. Camel бежать как standalone. Вот мой код:

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

    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. 
+0

Привет, Parag, у меня есть аналогичное требование, я использую ту же базу кода, что и вы, но я ничего не получаю в указанном пути. Какие изменения необходимы для одного и того же кода? Я проверил свой источник данных и установил соединение.Пожалуйста помоги. при необходимости я отправлю свой код. – Jayesh

ответ

2

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

0

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

5

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

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

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

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

SimpleRegistry registry = new SimpleRegistry(); 

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

registry.put("myDataSource", ds); 

CamelContext camel = new DefaultCamelContext(registry); 
+0

lbsen: Спасибо за информацию. Да, я тестировал это с помощью SimpleRegistry, но я получаю исключение. См. Вопрос, я обновил его. – ParagJ

+0

Вам нужно добавить jarb-jdbc JAR в путь к классам и зависимости от camel-jdbc. Если вы используете Maven, это легко, если нет, то вам может потребоваться загрузить и добавить несколько JAR вручную. –

+0

Для пользователей OSGI - функция: установить camel-jdbc –

Смежные вопросы