使用Camel从OracleDB读取表

时间:2017-08-02 11:58:26

标签: apache-camel apache-servicemix

您好我是服务组合的新手。任何人都指向我正确的方向如何从oracle Db读取表并将该表发布到本地文件。(这里我只想使用blueprint.XML内容,我可以直接在服务混合部署文件夹中部署。)

2 个答案:

答案 0 :(得分:0)

以下是一个例子:

public class JdbcReadFromOracleRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("sql:select full_name from common.company where code='1'?delay=3000&dataSource=oracleDataSource&outputType=SelectOne")
                .routeId("testOracleRead").autoStartup(true)
        .log(LoggingLevel.INFO, "JDBC oracle : ${body}");
        .to("file://c:/test/test.txt")
    }
}

您可以使用pax-jdbc(https://ops4j1.jira.com/wiki/spaces/PAXJDBC/overview)来创建数据源(https://ops4j1.jira.com/wiki/display/PAXJDBC/Oracle+driver+adapter)。

获得表格记录后,您可以使用模板引擎创建文件内容(例如 velocity http://camel.apache.org/velocity.html))或其他方式,然后通过组件档案(http://camel.apache.org/file2.html)。

答案 1 :(得分:0)

一种简单的方法是使用Camel's SQL Component

   <route id="foo">
       <from uri="sql:select * from foo"/>
   </route>

返回的数据将是Exchange正文中的地图列表,您可以在数据库选择后使用Camel's Splitter EIP轻松迭代,作为下一步:

<split>
   <simple>${body}</simple>
</split>

您可以通过多种方式在<split>内构建文件。可以使用simple${body[FIELD_NAME_HERE]}

访问单个字段值

但是请记住,每次拆分迭代都是新的交换,因此您无法在交换中的任何内容中汇总文件内容,例如标题或属性。相反,我可能会使用带有拆分的聚合策略,称为Composed Message Processor。这样,您可以在旧交换体中逐行构建您想要的任何格式的文件。然后在</split>结束后,只需使用Camel's File component将交换正文保存到文件中。

另一种选择是在SQL语句之后执行处理器,并且如果您更喜欢这样做,Java代码可以使用交换体中的List of Maps来迭代并构建文件。 Camel的分离器也有开销,所以如果性能是一个问题并且你正在处理成千上万的记录,这可能是最好的选择。