2017-12-20 3 views
0

파일 어댑터 구성봄 통합 (5.0) - 파일 어댑터 : 사용자 정의 스캐너에 방지 - 중복을 활성화하면 작동하지 않습니다

<int-file:inbound-channel-adapter 
    directory="/app/download/client/" 
    id="clientFileAdapter" 
    channel="channelOne" 
    scanner="myFileScanner" prevent-duplicates="true"> 
    <int:poller fixed-delay="1000" max-messages-per-poll="1"/> 
</int-file:inbound-channel-adapter> 

MyFileScanner.class

@Component("myFileScanner") 
public class MyFileScanner implements DirectoryScanner { 
@Autotwired 
    private MyFileFilter myFileFilter; 

    @Override 
    public List<File> listFiles(File file)throws IllegalArgumentException{ 
     File[] files = listEligibleFiles(file); 
     if(files==null){ 
      throw new MessagingException("The path is not valid"); 
     } 
     if(this.myFileFilter!=null){ 
      return this.myFilter.filterFiles(files); 
     } 
     else{ 
      return Arrays.asList(files); 
     } 
    } 

    //Other override methods 

    protected File[] listEligibleFiles(File directory){ 
     File[] rootFiles = directory.listFiles(); 
     ArrayList files = new ArrayList(rootFiles.length); 
     for(File rootFile:rootFiles){ 
      if(rootFile.isDirectory()){ 
       files.addAll(Arrays.asList(this.listEligibleFiles(rootFile)); 
      } 
      else{ 
       files.add(rootFile); 
      } 
     } 
     return (File[])files.toArray(new File[files.size()]); 
    } 
} 

MyFileFilter.class

@Component("myFileFilter") 
    public class MyFileFilter implements FileListFilter<File>{ 
     @Override 
     public List<File> filterFiles(File[] files){ 
      ArrayList accepted = new ArrayList(); 
      if(files != null){ 
       for(File f: files){ 
        if(f.getName.endsWith(".DAT")) 
         accepted.add(f); 
       } 
      } 
      return accepted; 
     } 
    } 

문제 :
파일 어댑터 구성에서 prevent-duplicates 플래그가 제거되면 코드는 제대로 작동하지만 동일한 파일이 반복해서 선택됩니다. 방지] - 중복 플래그가 존재하면
, 그것은 오류 '필터'및 '로커'옵션 본 N 제공된 외부 "스캐너"이어야 발생 : 스프링을 통해 5.0 문서를 읽은 후에

을 얻은 정보 아래.
외부 스캐너의 경우 FileReadingMessageSource에서 모든 필터 및 로커 속성을 금지합니다. 해당 사용자 정의 DirectoryScanner에서 (필요한 경우) 지정해야합니다. 즉, FileReadingMessageSource에 스캐너를 삽입하는 경우 FileReadingMessageSource가 아닌 해당 스캐너에서 필터와 라커를 제공해야합니다.

사용자 정의 스캐너를 사용할 때 같은 파일을 다시 선택하지 않도록 방지 방지 플래그 또는 사용자 지정 구현을 설정하는 방법에 대한 제안을 제공하십시오.

파일 메타 데이터 (이름 및 파일 생성 타임 스탬프 등)를 캐시하고 중복 파일을 결정하기 위해 파일을 어댑터에서 가져올 때마다 내 필터 클래스에서 비교할 때 응용 프로그램을 사용해야합니까?

답변

1

prevent-duplicates="true"AcceptOnceFileListFilter과 같다 :

   <xsd:documentation><![CDATA[ 
A boolean flag indicating whether duplicates should be prevented. If a 'filter' reference is 
provided, duplicate prevention will not be enabled by default (the assumption is that the 
provided filter is sufficient), but setting this to true will enable it. If a 'filename-pattern' 
is provided, duplicate prevention will be enabled by default (preceding the pattern matching), 
but setting this to false will disable it. If neither 'filter' or 'filename-pattern' is provided, 
duplicate prevention is enabled by default, but setting this to false will disable it. For more 
detail on the actual duplicate prevention, see the javadoc for AcceptOnceFileListFilter. 
       ]]></xsd:documentation> 

그래서, 당신은 당신의 사용자 정의 필터와 함께 그것을 구성하고 scanner에 조성물을 제공한다.

+0

감사합니다. !! 효과가있다. – Selva

관련 문제