2014-03-06 2 views
2

Apache Camel의 파일 구성 요소를 사용하여 이상한 장애물이 있습니다. 문제의 요지는 다음과 같습니다. 파일 구성 요소를 사용하여 디렉토리의 모든 메시지를로드합니다. 그런 다음 프로세서를 사용하여로드 된 파일에 대해 일부 작업을 수행합니다. 프로세스가 성공하면 파일을 다른 위치로 이동하고 원본 파일을 삭제합니다. 그러나 프로세스가 실패하면 원본 디렉토리에 메시지를 남깁니다. 코드는 다음과 같습니다.Apache Camel : 처리 후 원래 위치에 메시지를 다시 넣으십시오.

from("fileLocation") 
    .process(new MessageProcessor()) 
    .choice() 
     .when(header("processPassed").isEqualTo(true)) 
      .to("file:newLocation") 
    .otherwise() 
     .to("fileLocation"); 

프로세서가 통과하면 모든 것이 효과적입니다. 그러나 프로세서가 실패하고 메시지를 원래 위치로 되돌려 놓으려고하면 작동하지 않습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변

2

나는 두 가지 문제점이 있다고 생각합니다. 먼저 Camel이 파일을 처리 중이므로 두 번째로 동일한 파일을 반복적으로 처리 할 위험이 있으므로 파일을 원래 위치에 다시 쓸 수 없습니다. 이 문제를 얻으려면 두 가지 옵션을 사용할 수 있습니다

  1. preMove 같은 파일이 2 번 처리 방지하기 위해 작업 디렉토리
  2. idempotent을 사용합니다. 여기

내가 당신이 File Endpoint 설명서를 사용할 수

from("file:fileLocation?idempotent=true&preMove=working") 
     .process(new MessageProcessor()) 
     .choice() 
      .when(header("processPassed").isEqualTo(true)) 
       .to("file:newLocation") 
     .otherwise() 
      .to("file:fileLocation"); 

자세한 내용을 무엇을 필요로하지 믿는다 코드의 약간 수정 된 버전입니다.

1

documentation을 읽고 지정할 수있는 moveFailed 옵션이 있습니다. 파일을 원래 위치가 아닌 오류 폴더에 두는 것이 좋습니다. 그런 다음 불량 파일을 찾을 위치를 알 수 있습니다.

업데이트 : 파일을 그대로 두어야한다는 확고한 요구 사항이 있으므로 영구적 인 멱등 원 리포지토리를 설치해야합니다.

대개 docs에서 복사되며 처리 된 파일의 절대 파일 경로가 디스크의 파일에 저장되어 동일한 (파일 이름)을 다시 처리하지 않습니다.

<!-- this is our file based idempotent store configured to use the .filestore.dat as file --> 
<bean id="fileStore" class="org.apache.camel.processor.idempotent.FileIdempotentRepository"> 
    <!-- the filename for the store --> 
    <property name="fileStore" value="some/folder/.idempotentrepo/filestore.dat"/> 
    <!-- the max filesize in bytes for the file.--> 
    <property name="maxFileStoreSize" value="<some size>"/> 
</bean> 

<camelContext xmlns="http://camel.apache.org/schema/spring"> 
    <route> 
     <from uri="file://some/folder/?idempotentRepository=#fileStore&amp;noop=true"/> 
     <to uri="mock:result"/> 
    </route> 
</camelContext> 
+0

무한 루프 = 매우 나쁨! – vikingsteve

+0

파일을 오류 폴더로 이동하지만 원래 위치로 남겨 두는 것에 동의합니다. – David

+0

그런 다음 [Idempotent Consumer] (http://camel.apache.org/idempotent-consumer.html)를 만들어야합니다. 파일 끝점에서 onop 옵션과 같이 noop = true를 지정하면이 작업을 수행 할 수 있지만 응용 프로그램이 다시 시작되지 않는 한 1000 개 항목에 대해서만 작동합니다. 해답은 영구적 인 멱등 원 솔루션의 예제로 업데이트됩니다. –