2016-07-26 2 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 같은 구성 요소를 사용하여 데이터베이스에 파일을 삽입하기 위해이 경로를 수정하는 방법? 스프링 부트 애플리케이션에서 H2 데이터베이스를 사용하여이 작업을 수행하려고합니다.

+0

당신은 당신의 대상으로 낙타 JDBC 구성 요소를 사용할 수 있습니다 Gnanagurus가 그의 대답에서 보여준 것처럼. 그러나 INSERT 문을 작성하여 먼저 BODY 문에 입력해야합니다.또한 데이터베이스에서 정확히 원하는 것을 파악해야합니다. 먼저 파일의 레코드를 분할해야합니까? 전체 파일이 하나의 레코드로 들어갑니다 /. 방법? –

+0

전체 파일을 그대로 BLOB 형식으로 데이터베이스에 삽입하려고합니다. – user6641655

답변

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

삽입 쿼리 내에서 동일한 파일을 경로에서 사용할 수 있습니까? 예를 들어 : '.setBody (상수 ("테이블 값 (1, )"))' – user6641655

+0

에 삽입하십시오. 일단 파일을 폴링하면 헤더 나 속성에 파일을 저장하십시오. 간단한 표현식을 사용하여 쿼리에 전달하십시오. $ {properties : cheese.quote}/$ {headers.cheese.quote} – gnanagurus

+0

예 : .setBody (간단한 (" $ {header.file} ')")) – gnanagurus

1

기본적으로, 당신의 메시지 본문 파일입니다. 당신은 이것을 지속해야합니다. 이론적으로, 당신은 그것을 어디서나 지속하는 것을 포함하여 무엇이든하는 프로세서에 전달할 수 있습니다. 더 많은 표준 Camel 구성 요소를 사용하면 camel-jdbc 또는 camel-sql 또는 camel-jpa를 사용할 수 있습니다.

사용 낙타-SQL은 :

  1. 당신은 URL의 일부로 삽입 문을 전달할 수 있습니다.

    : 위에서 아래에서

    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. 그 전에, 당신은

코드는 다음과 같을 것 삽입 문에서 사용되는 매개 변수를 설정해야

  1. insert 문은 원했던 문과 같습니다 (두 개의 열이있는 테이블을 가정했습니다). 또한 "위치 매개 변수"대신 " 매개 변수"를 사용할 수 있다고 가정했습니다. (Camel 2.14 이전 버전이 있다면 다른 접근 방법을 확인하십시오.)
  2. 명명 된 매개 변수는 insert 문 앞에 속성으로 간단히 설정할 수 있습니다. 이것이 우리가 INSERT 전에 두 개의 "setProperty()"호출을하는 이유입니다.
  3. 본문이 FILE로 시작하기 때문에 먼저이를 String으로 변환합니다. 파일에 이진 데이터가있는 경우 다른 데이터로 변환 할 수 있습니다. 그것은 Serializable 뭔가 있어야합니다.

또한 삽입에 데이터 소스의 이름 지정 옵션이 있음을 알 수 있습니다. 이 이름 (dsTest1)을 사용할 수 있어야합니다. 내 경우에는, 나는 나의 봄 구성에서 다음과 같은 한 :

<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

관련 문제