当前位置: 首页 > 知识库问答 >
问题:

如何使用camel创建数据源?

凤晨朗
2023-03-14

我刚刚开始学习阿帕奇骆驼。我了解路线和组件的基本知识。现在,我想尝试连接到Oracle数据库,从一个特定表中读取记录,并使用组件将这些记录写入文件。为了从数据库中读取数据,我假设需要使用JDBC组件,并给出数据源名称。

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

我在Apache Camel 2.12.1中使用JDK7u25。

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

[编辑]

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

>

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

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

共有3个答案

施刚毅
2023-03-14

在那里提到Spring只是因为它是使用数据库的非常有用的范例(主要是因为Spring Framework引入的模板。)当然,您可以连接标准JDBC连接并自己实现DAO——这没什么错。

农诚
2023-03-14

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

姜振濂
2023-03-14

有一个SQL的例子显示了如何设置一个DataSource

  • http://camel.apache.org/sql-example.html

是的,使用Spring XML的示例。但是,如何设置数据源也可以在Java代码中完成。然后需要在Camel注册表中注册数据源。

例如,您可以使用JndiRegistry或SimpleRegistry。后者更容易。

下面是一些伪代码,展示了创建注册表、将bean添加到此注册表,然后将注册表提供给DefaultCamelContext的构造函数的原理。

SimpleRegistry registry = new SimpleRegistry();

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

registry.put("myDataSource", ds);

CamelContext camel = new DefaultCamelContext(registry);
 类似资料:
  • 问题内容: 问题: 是否可以在迁移脚本中创建一个新的数据库,然后连接到它?怎么样? 我的场景: 我正在尝试在Java项目(使用Jersey2.4 + tomcat 7 + PostgreSQL 9.3.1 + EclipseLink的RESTful应用程序)中使用flyway来管理使用git的不同开发人员之间的更改。我写了自己的初始化脚本,并运行了: 而且效果很好。问题是我无法使用脚本创建新的数据

  • null camel-kafka中是否有任何配置,我们可以使用它来增加kafka主题分区计数?

  • 问题内容: 使用SQLAlchemy,将创建一个Engine对象,如下所示: 如果to参数(在这种情况下为)中指定的数据库不存在,则访问将失败。如果指定的数据库不存在,是否可以告诉SQLAlchemy创建一个新数据库? 问题答案: 在postgres上,通常默认情况下存在三个数据库。如果您能够以超级用户身份(例如,角色)进行连接,则可以连接到或数据库。默认的pg_hba.conf只允许名为unix

  • 问题:是否可以在迁移脚本中创建一个新的DB,然后连接到它?怎么做? 我的场景:我试图在我的Java项目(使用Jersey2.4+Tomcat7+PostgreSQL 9.3.1+EclipseLink的RESTful应用程序)中使用flyway来管理使用Git的不同开发人员之间的更改。我编写了我的init脚本并运行它: 而且效果很好。问题是我不能用我的脚本创建新的DB。当我在脚本中包含以下一行时:

  • 问题内容: 我正在参加的编程班上为我提供了一个项目,但我不知道从哪里开始,并希望有人可以将我推向正确的方向。我只发布项目的一部分,以便有人可以向我展示一些代码,以了解如何完成编程,因为我之前参加过编程课程,但是我没有实践。 创建一个具有以下类的名为Registrar的应用程序: 一个学生类,该类至少为学生存储以下数据字段: 名称 学生证号码 学分数 还应该提供以下方法: 初始化名称和ID字段的构造

  • 问题内容: 读完Hibernate之后:hbm2ddl.auto=正在生产中更新吗?出现了一些问题。首先,我使用Hibernate的原因是要与数据库供应商无关(无需编写10个版本的“相同” sql查询,例如tsql vs. sql)。 我的问题是在创建数据库架构(生产环境)时出现的。据我所知,我有两种选择。 hbm2dll =更新 纯sql(ddl)脚本。 在上面的主题中广泛讨论了第一种选择。第二