2016-02-16 2 views
0

Я использую интеграцию с весной 4.2.4.RELEASE, и я наткнулся на ошибку. Я пытаюсь создать входящий канал с помощью настраиваемого каталога на основе «WatchServiceDirectoryScanner». Когда я пытаюсь ввести этот сканер, я получаю ошибку.файл: входящий канал-адаптер не работает при использовании пользовательского сканера

«Параметры« фильтр »и« шкафчик »должны присутствовать на прилагаемом внешнем« сканере »:«. Независимо от того, какую комбинацию свойств я пробовал, она не работает. Причина в том, что даже я поставляю шкафчик и фильтрует свой собственный сканер, чтобы «FileReadingMessageSource» весной создавал свои собственные. Поэтому, когда он утверждает,

Assert.state(!(this.scannerExplicitlySet && (this.filter != null || this.locker != null)), 
       "The 'filter' and 'locker' options must be present on the provided external 'scanner': " 
         + this.scanner); 

не удается. Существует фильтр, который является «FileListFilterFactoryBean.initializeFileListFilter», независимо от того, какая комбинация была установлена, код ниже будет создавать один, и все вещи просто терпят неудачу.

 // no filters are provided 
     else if (Boolean.FALSE.equals(this.preventDuplicates)) { 
      filtersNeeded.add(new AcceptAllFileListFilter<File>()); 
     } 
     else { // preventDuplicates is either TRUE or NULL 
      filtersNeeded.add(new AcceptOnceFileListFilter<File>()); 
     } 

Я прочитал этот пост: How to skip the settings of filter and locker , но он не работает для меня. Кто-нибудь нашел решение для этого?

Вот пример конфигурации XML для создания входящего канала.

 <bean id="inboundChannel_3522_filter" class="org.springframework.integration.file.filters.CompositeFileListFilter"> 
     <constructor-arg> 
      <list> 
       <bean class="org.springframework.integration.file.filters.RegexPatternFileListFilter"> 
        <constructor-arg value="^Test_(20160216).TXT$" /> 
       </bean> 
      </list> 
     </constructor-arg> 
    </bean> 
    <bean id="inboundChannel_3522_nio_locker" class="org.springframework.integration.file.locking.NioFileLocker" /> 
    <bean id="inboundChannel_3522_scanner" class="com.test.spring.integraton.file.NonRecursiveWatchServiceDirectoryScanner" 
> 
     <constructor-arg value="e:\data\incoming\Test-V2" /> 
     <property name="filter" ref="inboundChannel_3522_filter"/> 
     <property name="locker" ref="inboundChannel_3522_nio_locker"/> 
    </bean> 
    <file:inbound-channel-adapter id="inboundChannel_3522" auto-create-directory="true" scanner="inboundChannel_3522_scanner" 
directory="file:/c:/data/incoming/TEST/" prevent-duplicates="false" ignore-hidden="false" > 
     <integration:poller fixed-rate="1000"/> 
    </file:inbound-channel-adapter> 

В основном я хочу знать, есть ли способ, чтобы переопределить боб FileReadingMessageSource, так что я могу изменить Assert?

ответ

0

У меня есть вопрос, как обойти эту ошибку. Поэтому я создаю сканер, и я вставляю фильтры и шкафчики в сканер. Я создаю собственный файл FileReadingMessageSourceFactoryBean, который пропускает создание фильтра и блокиратора, если сканер был введен. Файл CustomFileReadingMessageSourceFactoryBean с изменениями показан ниже. Изменения происходят на строке 172. Остальные - то же самое.

  if (this.scanner != null) 
     { 
      this.source.setScanner(this.scanner); 
     } 
     else 
     { 
      if (this.filter != null) 
      { 
       if (this.locker == null) 
       { 
        this.source.setFilter(this.filter); 
       } 
       else 
       { 
        CompositeFileListFilter<File> compositeFileListFilter = new CompositeFileListFilter<File>(); 
        compositeFileListFilter.addFilter(this.filter); 
        compositeFileListFilter.addFilter(this.locker); 
        this.source.setFilter(compositeFileListFilter); 
        this.source.setLocker(locker); 
       } 
      } 
      else if (this.locker != null) 
      { 
       CompositeFileListFilter<File> compositeFileListFilter = new CompositeFileListFilter<File>(); 
       compositeFileListFilter.addFilter(new FileListFilterFactoryBean().getObject()); 
       compositeFileListFilter.addFilter(this.locker); 
       this.source.setFilter(compositeFileListFilter); 
       this.source.setLocker(locker); 
      } 
     } 

Новый весенний XML выглядит, как показано ниже. Разница заключается в том, что мы добавляем bean inboundChanel_3522.adapter.source в конец. Это происходит, когда входящий канал ищет компонент типа FileReadingMessageSourceFactoryBean, который добавит к своему id «.adpater.source», и если он существует, он будет использовать это, иначе он создаст значение по умолчанию. В этом случае он будет использовать наш CustomFileReadingMessageSourceFactoryBean, у которого есть логика, чтобы пропустить создание дополнительных фильтров. Очень важно, чтобы пользовательский компонент появился после входящего канала-адаптера, иначе фабрика bean переопределит его. Наконец, вот как должен выглядеть XML.

<bean id="inboundChannel_3522_filter" class="org.springframework.integration.file.filters.CompositeFileListFilter"> 
    <constructor-arg> 
     <list> 
      <bean class="org.springframework.integration.file.filters.RegexPatternFileListFilter"> 
       <constructor-arg value="^Test_(20160216).TXT$" /> 
      </bean> 
     </list> 
    </constructor-arg> 
</bean> 
<bean id="inboundChannel_3522_nio_locker" class="org.springframework.integration.file.locking.NioFileLocker" /> 
<bean id="inboundChannel_3522_scanner" class="com.test.spring.integraton.file.NonRecursiveWatchServiceDirectoryScanner"> 
    <constructor-arg value="e:\data\incoming\Test-V2" /> 
    <property name="filter" ref="inboundChannel_3522_filter"/> 
    <property name="locker" ref="inboundChannel_3522_nio_locker"/> 
</bean> 
<file:inbound-channel-adapter id="inboundChannel_3522" auto-create-directory="true" 
    scanner="inboundChannel_3522_scanner" 
    directory="file:/c:/data/incoming/TEST/" prevent-duplicates="false" ignore-hidden="false" > 
    <integration:poller fixed-rate="1000"/> 
</file:inbound-channel-adapter> 
<bean id="inboundChannel_3522.adapter.source" class="com.test.spring.integraton.file.CustomFileReadingMessageSourceFactoryBean"> 
    <property name="scanner" ref="inboundChannel_3522_scanner"/> 
    <property name="directory" value="e:\data\incoming\Test-V2"/> 
    <property name="autoCreateDirectory" value="true"/> 
</bean> 
Смежные вопросы