2017-11-06 3 views
1

인바운드 스트림 기능을 이용하려면 통합 플로우를 4.3.12에서 5.0.0.RC1로 업그레이드했습니다. 나는 patternFilter와 regexFilter가 모두 필터링되지 않는다는 것을 알고 있습니다. 스트리밍 인터페이스가 아니라는 것을 확인하기 위해 필자는 파일 기반 인터페이스를 사용해 보았고 동일한 결과를 보았습니다. 4.3.12에서FTP IntegrationFlows 필터가 Spring Integration 5.0.0.RC1에서 작동하지 않음

나는 내 파일 기반의 흐름에 의해 정의했다 :

return IntegrationFlows 
    .from(Ftp.inboundAdapter(ftpSessionFactory()) 
     .preserveTimestamp(true) 
     .remoteDirectoryExpression(remoteDirectory()) 
     .regexFilter("sn\\.[0-9]{4}\\.txt$") 
     .filter(ftpPersistantFilter()) 
     .localFilter(fileSystemPersistantFilter()) 
     .localFilename(f -> (currentUtcDay.toString("YYYYMMdd")) + "." + f) 
     .localDirectory(new File(this.localDirectory)), 
     e -> e.id("ftpInboundAdapter").poller(Pollers.fixedDelay(100))) 
    .channel(MessageChannels.queue("ftpInboundResultChannel")) 
    .get(); 

그것은 필터링되지 않습니다 일관성을

return IntegrationFlows 
    .from(s -> s.ftp(ftpSessionFactory()) 
     .preserveTimestamp(true) 
     .remoteDirectoryExpression(remoteDirectory()) 
     .regexFilter("sn\\.[0-9]{4}\\.txt$") 
     .filter(ftpPersistantFilter()) 
     .localFilter(fileSystemPersistantFilter()) 
     .localFilename(f -> (currentUtcDay.toString("YYYYMMdd")) + "." + f) 
     .localDirectory(new File(this.localDirectory)), 
     e -> e.id("ftpInboundAdapter").autoStartup(true)) 
    .channel(MessageChannels.queue("ftpInboundResultChannel")) 
    .get(); 

, 여기 5.0.0.RC1에서 같은 정의는 5.0.0.RC1. 필터 구성이 변경 되었습니까? 내가해야 할 일이 더 있니?

편집 : 다음 사람에게 다음 수정 프로그램이 있습니다.

@Bean 
public FtpPersistentAcceptOnceFileListFilter ftpPersistantFilter() { 
    return new FtpPersistentAcceptOnceFileListFilter(metadataStore(), "ftpPersistentAcceptOnce"); 
} 

에 :

@Bean 
public CompositeFileListFilter ftpPersistantFilter() { 
    CompositeFileListFilter filters = new CompositeFileListFilter(); 
    filters.addFilter(new FtpPersistentAcceptOnceFileListFilter(metadataStore(), "ftpPersistentAcceptOnce")); 
    filters.addFilter(new FtpRegexPatternFileListFilter(regexFilter)); 
} 

답변

1

5.0가 완전히 이전 필터 인식 옵션을 무시 .filter(ftpPersistantFilter())처럼 봄 통합의 변화 :

return IntegrationFlows 
    .from(Ftp.inboundAdapter(ftpSessionFactory()) 
     .preserveTimestamp(true) 
     .remoteDirectoryExpression(remoteDirectory()) 
     .filter(ftpPersistantFilter()) 
     .localFilter(fileSystemPersistantFilter()) 
     .localFilename(f -> (currentUtcDay.toString("YYYYMMdd")) + "." + f) 
     .localDirectory(new File(this.localDirectory)), 
     e -> e.id("ftpInboundAdapter").poller(Pollers.fixedDelay(100))) 
    .channel(MessageChannels.queue("ftpInboundResultChannel")) 
    .get(); 

는 그럼 난에서 내 ftpPersistantFilter을 변경

/** 
* Configure a {@link FileListFilter} to be applied to the remote files before 
* copying them. 
* @param filter the filter. 
* @return the spec. 
*/ 
public S filter(FileListFilter<F> filter) { 
    this.synchronizer.setFilter(filter); 
    return _this(); 
} 

따라서 .regexFilter("sn\\.[0-9]{4}\\.txt$")은 무시됩니다.

예상치 못한 내부 구성과 혼동을 피하기 위해이 변경이 수행됩니다. 예를 들어 regexpattern 필터는 FtpPersistentAcceptOnceFileListFilter과 함께 구성되어있다 : https://docs.spring.io/spring-integration/docs/5.0.0.RC1/reference/html/whats-new.html#__s_ftp_changes을 :

모든 인바운드 채널 어댑터 (스트리밍 및 동기화 기반) 이제 원격 파일을 다운로드 중복 방지하기 위해 기본적으로 적절한 AbstractPersistentAcceptOnceFileListFilter 구현을 사용합니다.

즉, 모든 필터 기반 옵션은 상호 배타적이며 마지막 필터가 우선합니다. 최종 사용자가 예기치 않은 돌연변이에 대해 걱정할 필요가 없도록 지원하는 것이 훨씬 쉬운 옵션입니다.

귀하의 요구 사항을 수정하려면 ftpPersistantFilterFtpRegexPatternFileListFilterCompositeFileListFilter을 사용해야합니다.

나는 Migration Guide 글 머리 기호를 추가해야한다고 생각합니다. 이해해 주셔서 감사합니다.

+0

감사합니다. Artem! 제안 된 변경 사항으로 내 질문을 업데이트했으며 완벽하게 작동합니다. – brentlemons