2012-12-12 3 views
4

ftp가 우리 서버에 파일을 가지고있는 고객이 있습니다. 이 디렉토리에서 특정 파일을 선택하고 처리 할 다른 디렉토리로 이동하도록 경로를 정의했습니다. 문제는 ftp가 완료 될 때까지 기다리는 것이 아니라 즉시 확인하는 것입니다. 결과는 uri에 설명 된 경로의 0 바이트 파일입니다. 나는 각 readLock 옵션 (masterFile, rename, changed, fileLock)을 시도했지만 아무 것도 작동하지 않았다. 나는 내 낙타 경로를 정의하기 위해 봄 DSL을 사용하고있다. 다음은 작동하지 않는 예입니다. 낙타 버전은 2.10.0입니다.ftp가 완료되기 전에 낙타 경로 파일을 가져옵니다.

<route> 
     <from uri="file:pathName?initialDelay=10s&amp;move=ARCHIVE&amp;sortBy=ignoreCase:file:name&amp;readLock=fileLock&amp;readLockCheckInterval=5000&amp;readLockTimeout=10m&amp;filter=#FileFilter" /> 
     <to uri="file:pathName/newDirectory/" /> 
    </route> 

아무 도움이됩니다. 감사!

참고로 ... 한 번에이 경로가 다른 서버에서 실행 중이므로 파일을 처리 한 다른 서버로 파일을 ftp해야했습니다. 낙타에서 ftp 구성 요소를 사용할 때 경로가 올바르게 작동했습니다. 그것은 ftp를하기 전에 파일이 수신 될 때까지 기다렸습니다. 나는 나의 노선에 동일한 옵션을 정의했다. 그 이유는 내가 ftp 구성 요소가 낙타의 파일 구성 요소 옵션을 사용하기 때문에 그것을 할 방법이 있어야한다고 생각하는 이유입니다.


나는 PeteH의 제안 # 2을 취하고 다음을 수행했습니다. 나는 아직도 다른 방법이 있기를 바라고 있지만 이것은 효과가있다.

나는 나에게 current.minus (x 초)의 날짜 초기 필터링에 해당하는 경우

public static Date getDateMinusSeconds(Integer seconds) { 
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.SECOND, seconds); 
return cal.getTime(); 
} 

그런 다음 내 필터 내에서 내가 확인을 반환하는 다음과 같은 방법을 추가했습니다. 그것이 나는 마지막 수정 날짜를 getDateMinusSeconds()와 비교합니다. 비교가 true이면 필터에 대해 false를 반환합니다.

if(filter){ 
     if(new Date(pathname.getLastModified()).after(DateUtil.getDateMinusSeconds(-30))){ 
      return false; 
     } 
    } 
+1

readLock = 변경되지 않았으며 readLockCheckInterval과 readLockTimeout도 같은 일을합니까? –

+0

사실입니다. @Ken. readlock = change에 대한 코드를 살펴 봤지만 당시에는 정상적으로 작동하는 것처럼 보였지만 어떤 이유로 작동하지 않는지 기억합니다. thereadLockCheckInterval을 조정하려했는지 기억하지 못합니다. 나는 내가 그랬다고 생각했을 것이다. – Curt

+0

아래에 나와있는 다른 의견에서 언급 한 내용 때문에이 문제를 해결했습니다. – Curt

답변

5

FTP를 사용하여이 환경을 수행하지는 않았지만 이러한 종류의 문제가있었습니다.

내가 제안 할 수있는 두 가지 옵션 중 더 나은 옵션은 고객이 두 개의 파일을 보내도록 할 수 있는지 여부입니다. File1은 데이터이고 File2는 아무 것도 될 수 있습니다. 그들은 그것을 순차적으로 보낸다. File2가 도착하면 함정에 빠지지만, File1이 안전하게 도착한 "신호"로 사용하는 것뿐입니다.

좋지 않은 옵션 (전송되는 파일을 제어 할 수 없어 구현이 완료된 것입니다)은 코드를 작성하여 최종 수정 타임 스탬프가 최소 이상이 될 때까지 파일을 처리하지 못하도록합니다 x 분 전입니다. 나는 우리가 5 분 동안 정착했다고 생각한다. 본질적으로 해고, 수면, 수면 검사 등을하기 때문에 이것은 매우 끔찍합니다.

그러나 설명하는 문제는 FTP로 잘 알려져 있습니다. 내가 말했듯이, 나는이 접근법 중 하나가 당신의 환경에서 효과가 있을지 모르지만 확실히 높은 수준에서 그들은 확실합니다.

+1

이들은 좋은 아이디어입니다. 당신이 말했듯이, 우리가 가진 고객의 수 때문에 옵션 1을 사용하는 것이 어려울 것입니다. 또한 대부분의 고객은 SFTP를 사용하고 있지만 내 경우에는 별 차이가 없습니다. 아무 것도 할 수 없다면 두 번째 옵션이 내 마지막 수단 일 것이라고 생각합니다. – Curt

+0

@Curt, last resort .... 정확히 우리가 생각한 것입니다 ;-) – PeteH

+0

첫 번째 옵션에서 말한 것을 끝내게되었습니다. 각 고객은 이제 우리가 확인한 다른 신호 파일을 보내 어떤 파일을 가져올 지 알려줍니다. 두 번째 옵션은 전송이 진행되는 동안 수정 된 날짜를 최신으로 업데이트하는 클라이언트에 달려 있다는 것을 발견했습니다. 모든 클라이언트가이 작업을 수행하는 것은 아니며 몇 시간 전에 파일이 업데이트/생성 되었기 때문에 프로세스가 완료되는 경우가 있습니다. – Curt

2

낙타는 파일 구성 요소에서 상속됩니다. 이것은 바로이 것을 묘사하는 맨 위에 있습니다.

JDK File IO API는 다른 응용 프로그램이 현재 파일을 쓰고 복사하고 있는지 여부를 감지하는데 약간의 제한이 있습니다. 구현은 OS 플랫폼에 따라 다를 수 있습니다. 이것은 Camel이 파일이 다른 프로세스에 의해 잠겨 있지 않다고 생각하고 그것을 소비하기 시작할 수 있습니다. 그러므로 당신은 자신의 환경에 맞는 것을 조사해야합니다. 이 Camel을 돕기 위해 사용할 수있는 다양한 readLock 옵션과 doneFileName 옵션을 제공합니다. 다른 사람들이 직접 파일을 드롭하는 폴더의 파일 사용 섹션을 참조하십시오.

이 문제를 해결하기 위해 게시자에게 "완료"파일을 보냈습니다. 이것은이 문제를 해결합니다

+0

완료 파일의 존재 여부를 확인한 방법을 공유 할 수 있었지만 라우팅에서 데이터 파일을 사용 했습니까? 나는 이것을 정확하게하는 것에 흥미가 있지만 (xml dsl) Camel에게 새로운 것이다. – Ron

+0

? doneFileName = filename.doneextension 일단 내가 실제로 RTFM을하면 아주 간단합니다. – Ron

관련 문제