使用Camel将文件插入数据库

时间:2016-07-26 20:18:43

标签: spring-boot apache-camel h2

我已经编写了使用Camel将文件从源目录移动到目标目录的路由。我需要一些帮助将这些文件移动到数据库。这是将文件从一个目录移动到另一个目录的路径:

private static RouteBuilder createRouteBuilder() {
    return new RouteBuilder() {
        public void configure() {
            from("file:data/outbox?idempotent=true&idempotentKey=${file:name}-${file:size}&noop=true&readLock=changed&delete=true")
                    .choice()
                    .when(header("CamelFileName").endsWith(".log"))
                    .process(new Processor() {
                        public void process(Exchange exchange) {
                            logger.log(Level.INFO, "File: " + exchange.getIn().getHeader("CamelFileName") + " has been updated");
                        }
                    })
                    .to("file:data/log");
        }
    };
}

如何修改此路由以使用SqlComponent等组件将文件插入数据库?我试图在Spring Boot应用程序中使用H2数据库来执行此操作。

2 个答案:

答案 0 :(得分:1)

替换:

.to("file:data/log");

.setBody(constant("select * from your query"))
.to("jdbc:yourdatabase")

同时添加此依赖项:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jdbc</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

答案 1 :(得分:1)

基本上,您的邮件正文是一个文件。你必须坚持这一点。从理论上讲,你可以把它传递给一个可以做任何事情的处理器,包括坚持到任何地方。使用更多标准的Camel组件,您可以使用camel-jdbc,camel-sql或camel-jpa。

使用camel-sql:

  1. 您可以将insert语句作为URL的一部分传递。
  2. 在此之前,您必须设置将在其中使用的参数 插入声明
  3. 代码如下所示:

    from("file://c:/test/in1a?noop=true")
      .convertBodyTo(String.class)
      .setProperty("fileName", simple("${header.CamelFileAbsolutePath}"))
      .setProperty("fileContents", body())
      .to("sql:insert into TEST1.FILE_UPLOAD (FILE_NAME, FILE_CONTENTS) 
               VALUES(:#${property.fileName} 
                  , :#${property.fileContents})?dataSource=dsTest1");
    

    从下到上:

    1. 插入语句就像你想要的那样(我假设了一个 有两列的表)。另外,我假设你可以使用“命名 参数“而不是”位置参数“。(如果你有比Camel更早的东西 2.14检查其他方法的文档)
    2. 可以在insert语句之前将命名参数简单地设置为属性。这就是我们在INSERT之前有两个“setProperty()”调用的原因。
    3. 由于正文以FILE开头,我首先将其转换为String。如果您的文件包含二进制数据,则可以将其转换为其他数据。它需要是Serializable。
    4. 您可能会注意到该插入还有一个命名数据源的选项。此名称(dsTest1)需要可用。就我而言,我在Spring配置中有以下内容:

      <bean name="dsTest1"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <property name="driverClassName" value="com.mysql.jdbc.Driver" />
          <property name="url" value="jdbc:mysql://localhost:3306/test1" />
          <property name="username" value="user01" />
          <property name="password" value="password01" />
      </bean>
      
      <bean name="route07Bean" class="com.mycompany.RouteBuilder07" />
      
      <camelContext xmlns="http://camel.apache.org/schema/spring">
      
      </camelContext>
      

      POM的依赖关系是:

      <dependency>
          <groupId>org.apache.camel</groupId>
          <artifactId>camel-sql</artifactId>
          <version>${camel-version}</version>
      </dependency>
      

      Here's a link to the Documentation for the SQL component