如何使用camel创建数据源?

我刚开始学习Apache Camel。 我理解了路由和组件的基础知识。 现在,我想尝试连接到Oracle数据库,从一个特定的表读取记录,并使用File组件将这些记录写入File 。 要从数据库中读取,我假设我需要使用JDBC组件并提供dataSourceName

但是,我找不到有关如何使用camel创建dataSource的任何信息。 我发现与此主题相关的所有信息都使用Spring DSL示例。 我不使用Spring,我只需要使用简单的独立Java应用程序来测试它。

我正在使用JDK7u25和Apache Camel 2.12.1。

有人可以发布样本从oracle表中读取并写入文件吗?

[编辑]

在网上查看了几个解决方案后,我开始了解以下两种方法:

  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. 使用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; } } 

但在这两种情况下,我都会遇到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. 

有一个SQL示例,它显示了如何设置DataSource

是的,使用Spring XML的示例。 但是,如何设置DataSource也可以在Java代码中完成。 然后,您需要在Camel注册表中注册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); 

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

之所以提到Spring只是因为它是使用DB的非常有用的范例(主要是因为Spring Framework引入的模板 。)当然你可以自己连接标准的JDBC连接并实现DAO – 没有错。