2013-10-14 33 views
7

我剛開始學習Apache Camel。我瞭解路由和組件的基礎知識。現在我想嘗試連接到Oracle數據庫,從一個特定的表讀取記錄並使用File組件將這些記錄寫入文件。要從數據庫中讀取,我假設我需要使用JDBC組件並給出dataSourceName如何使用駱駝創建數據源?

但是,我找不到有關如何使用駱駝創建數據源的任何信息。我發現與本主題相關的所有信息都使用Spring DSL示例。我不使用Spring,我只需要使用簡單的獨立Java應用程序來測試它。

我在Apache Camel 2.12.1上使用JDK7u25。

有人可以發佈樣本從oracle表中讀取並寫入文件嗎?

[編輯]

檢查網絡上的幾個解決方案之後,我來了解以下兩種方法:

  1. 駱駝爲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. 使用Claus 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

太傻了!我沒有在CLASSPATH中包含camel-jdbc-2.12.1.jar。現在上面的例子工作。

5

還有就是SQL例子展示如何設置一個DataSource

是,使用的Spring XML實例。但是,如何設置DataSource也可以在Java代碼中完成。然後你需要在Camel Registry中註冊DataSource。

例如,您可以使用JndiRegistrySimpleRegistry。後者更容易。

這是一些僞代碼,顯示創建註冊表的原理,將您的bean添加到此註冊表中,然後將註冊表提供給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

您需要將camel-jdbc JAR添加到類路徑以及來自camel-jdbc的依賴項。如果您使用的Maven非常簡單,那麼您可能需要手動下載並添加更多JAR。 –

+0

對於OSGI用戶 - 功能:安裝camel-jdbc –