2016-07-26 7 views
1

Camelを使用して、ソースディレクトリからコピー先ディレクトリにファイルを移動するためのルートを記述しました。これらのファイルをデータベースに移動するには、何か助けが必要です。これは、あるディレクトリから別のディレクトリにファイルを移動するためのルートです: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ブートアプリケーションでH2データベースを使ってこれをやろうとしています。

+0

は、あなたの目的地としてラクダ-JDBCコンポーネントを使用することができますGnanagurusが答えてくれたように。しかし、INSERT文を作成して、まずBODYに入れる必要があります。また、データベースの正確な内容を把握する必要があります。まず、ファイルのレコードを分割する必要がありますか?ファイル全体が1つのレコードに入りますか?どうやって? –

+0

ファイル全体をそのままBLOB型としてデータベースに挿入しようとしています。 – user6641655

答えて

1

置き換えます

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

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

をも、この依存関係を追加:

<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> 
+0

挿入クエリ内のルートから同じファイルを使用する方法はありますか?たとえば、 '.setBody(定数("テーブル値(1、)に挿入) ")' – user6641655

+0

もちろん、ファイルをポーリングした後は、ヘッダーまたはプロパティに格納します。シンプルな式を使用すると、クエリに渡します。 $ {properties:cheese.quote}/$ {headers.cheese.quote} – gnanagurus

+0

例:.setBody(単純な( " $ {header.file} ')")) – gnanagurus

1

は基本的に、あなたのメッセージ本体はFILEです。これを維持しなければなりません。理論的には、どこにでも永続させるなど、何でもするプロセッサに渡すことができます。より多くの標準的なCamelコンポーネントを使用すると、camel-jdbc、またはcamel-sql、またはcamel-jpaを使用できます。

ラクダ-SQLを使用して:

  1. をあなたがURLの一部としてinsert文を渡すことができます。

    :に上から下から

    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"); 
    

  2. その前に、あなたは

コードは次のようになり insert文で使用されるパラメータを設定する必要があります

  1. insert文は、あなたが望むものと同じです(私は の2つのカラムを持つテーブルを想定しています)。また、「位置パラメータ」の代わりに「 という名前のパラメータ」を使用できると仮定しました。 (Camel 2.14より前のものがあれば、他のアプローチについては文書をチェックしてください)
  2. 名前付きパラメータは、単にinsert文の前にプロパティとして設定することができます。そのため、INSERTの前に2つの "setProperty()"呼び出しがあります。
  3. ボディはFILEとして開始されるので、まずそれをStringに変換します。ファイルにバイナリデータがある場合、それを別のものに変換することができます。シリアライズ可能なものである必要があります。

この挿入には、データソースの名前を付けるオプションもあります。この名前(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

+0

ありがとう、ファイルをデータベースに挿入できました。もしあれば、私は例外をキャッチします。例外が発生した場合、元の場所からファイルを削除しないオプションがありますか? – user6641655

+0

"moveFailed"はあなたのために働くかもしれませんか? http://camel.apache.org/file2.html –

+0

私は "delete = true"を使用していますが、処理が成功した場合にのみファイルが削除されるとドキュメントには記載されています。例外が発生した場合、たとえば、アプリケーションの実行中に接続の問題が発生した場合など、ファイルが同じディレクトリに存在する必要があります。 – user6641655

関連する問題