2017-02-17 5 views
1

<int-sftp:inbound-streaming-channel-adapter/>은 파일에 대한 디렉토리를 폴링하고 발견되면 스트림을 서비스 활성기로 전달하는 플로우를 구현합니다.RedisLockRegistry와의 Spring 통합 예제

문제는 앱이 여러 개 실행되고있어 하나의 인스턴스 만 파일을 선택할 수 있도록 프로세스를 잠그고 싶습니다.

설명서를 보면 Redis Lock 레지스트리가 해결책으로 보이며 xml에 사용 된 예가 있습니까?

필자가 찾을 수있는 것은 소스 코드와 소스 코드입니다.

http://docs.spring.io/spring-integration/reference/html/redis.html 점 24.1

추가 정보 : 필자는 RedisMetaDataStore 및 SftpSimplePatternFileListFilter을 추가했다. 작동하지만 sftpInboundAdapter가 폴러에 의해 활성화되면 메타 데이터 저장소에있는 각 파일에 대한 항목을 추가 할 때 이상한 점이 하나 있습니다. 10 개의 파일이 있다고 가정하면 데이터 저장소에 10 개의 항목이 있지만 "1 go"에서 10 개의 파일을 모두 처리하지는 않습니다. 어댑터에서 폴당 처리되는 파일은 1 개뿐입니다. 환경에서 파일을 가져온 서버가 5 개의 파일을 처리 한 후 다운되면 다른 서버는 파일을 "만지"않으면 나머지 5 개의 파일을 선택하지 않는 것입니다.

폴링 당 파일 1 개가 올바른지 또는 한 폴링 중에 모든 유효한 파일을 처리해야합니까? 다음은

내 XML

<int:channel id="sftpInbound"/> <!-- To Java --> 
<int:channel id="sftpOutbound"/> 
<int:channel id="sftpStreamTransformer"/> 

<int-sftp:inbound-streaming-channel-adapter id="sftpInboundAdapter" 
     channel="sftpInbound" 
     session-factory="sftpSessionFactory" 
     filter="compositeFilter" 
     remote-file-separator="/" 
     remote-directory="${sftp.directory}"> 
    <int:poller cron="${sftp.cron}"/> 
</int-sftp:inbound-streaming-channel-adapter> 

<int:stream-transformer input-channel="sftpStreamTransformer" output-channel="sftpOutbound"/> 

<bean id="compositeFilter" 
    class="org.springframework.integration.file.filters.CompositeFileListFilter"> 
    <constructor-arg> 
     <list> 
      <bean 
       class="org.springframework.integration.sftp.filters.SftpSimplePatternFileListFilter"> 
       <constructor-arg value="Receipt*.txt" /> 
      </bean> 
      <bean id="SftpPersistentAcceptOnceFileListFilter" class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter"> 
       <constructor-arg ref="metadataStore" />     
       <constructor-arg value="ReceiptLock_" />      
      </bean> 
     </list> 
    </constructor-arg> 
</bean> 

<bean id="redisConnectionFactory" 
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> 
    <property name="port" value="${redis.port}" /> 
    <property name="password" value="${redis.password}" /> 
    <property name="hostName" value="${redis.host}" /> 
</bean> 

답변

0

없음입니다; 자물쇠 레지스트리가 아닌 Redis (또는 다른 메타 데이터) 저장소와 함께 SftpPersistentAcceptOnceFileListFilter (docs here)을 사용해야합니다.

편집

아래에 귀하의 코멘트에 대해서.

예, 알려진 문제입니다. next release에 정확히 max-fetch-size을 추가 했으므로 인스턴스는 각각 인스턴스를 가져 오는 첫 번째 인스턴스가 아닌 일부 파일을 검색 할 수 있습니다.

(인바운드 어댑터는 저장소에없는 파일을 먼저 로컬 디스크에 복사 한 다음 한 번에 하나씩 내보내는 방식으로 작동합니다.)

5.0 현재 이정표로만 사용 가능 M2 at the time of writing, but the current version and milestone repo can be found here; 그것은 몇 달 더 풀려나 지 않을 것입니다.

또 다른 대안은 아웃 바운드 게이트웨이를 사용하는 것입니다. 하나는 파일을 LS하고 다른 하나는 개별 파일을 얻는 것입니다. 하지만 앱에서 메타 데이터 저장소 자체를 사용해야 만 가져올 수있는 파일을 확인할 수 있습니다.

+0

감사합니다. Gary, Ive는 제안대로 구현했으며 거의 ​​거기에 있다고 생각합니다. 문제를 설명하는 원래 질문에 추가 정보를 추가했습니다. – sdiaz1000

+0

자세한 내용은 내 대답 편집을 참조하십시오. –

+0

Ive가 작동했습니다. poller에 max-messages-per-poll 속성을 추가하고이를 10으로 설정하면 정상적으로 작동합니다. 감사. – sdiaz1000