2015-05-06 95 views
1

我有一個流,其中包含一個模塊,其行爲與source:file模塊的行爲類似,只是使用redisMetaDataStore和Spring Integration的FileSystemPersistentAcceptOnceFileListFilter只檢測一次文件,以便模塊可以記住哪些文件已經在容器重啓之間被讀取。Spring XD源代碼失敗處理

文件persisting.xml

<beans:bean id="redisMetadataStore" class="org.springframework.integration.redis.metadata.RedisMetadataStore" > 
     <beans:constructor-arg ref="redisConnectionFactory" /> 
    </beans:bean> 

    <beans:bean id="persistentAcceptOnceFileFilter" class="org.springframework.integration.file.filters.FileSystemPersistentAcceptOnceFileListFilter"> 
     <beans:constructor-arg ref="redisMetadataStore" /> 
     <beans:constructor-arg value="${metadataPrefix}" /> 
    </beans:bean> 

    <beans:bean id="antPatternFileFilter" class="org.springframework.integration.file.filters.SimplePatternFileListFilter"> 
     <beans:constructor-arg value="${pattern}" /> 
    </beans:bean> 

    <beans:bean id="compositeFileFilter" class="org.springframework.integration.file.filters.CompositeFileListFilter"> 
     <beans:constructor-arg> 
      <beans:list> 
       <beans:ref bean="antPatternFileFilter" /> 
       <beans:ref bean="persistentAcceptOnceFileFilter" /> 
      </beans:list> 
     </beans:constructor-arg> 
    </beans:bean> 

    <file:inbound-channel-adapter 
      auto-startup="false" 
      channel="file" directory="${dir}" filter="compositeFileFilter"> 
     <poller fixed-delay="${fixedDelay}" time-unit="SECONDS"/> 
    </file:inbound-channel-adapter> 

    <channel id="file"/> 

    <chain id="extractContents" input-channel="file" output-channel="output"> 
     <header-enricher> 
      <header name="contentType" value="application/octet-stream"/> 
     </header-enricher> 
     <file:file-to-bytes-transformer/> 
    </chain> 

    <channel id="output"/> 

我遇到的問題是,應該Redis的容器下去,persistentAcceptOnceFileFilter會拋出異常時,它被調用時,在errorChannel登陸他們。

不幸的是,在我的組織內,發佈在errorChannel中的所有消息都是由一個服務接收的,該服務通過電子郵件發送給團隊,並在我們的售票系統中發佈故障單,這意味着如果redis在夜間發生故障,我們的售票系統將會有數以萬計的消息被一些糟糕的團隊成員不得不經歷和關閉所淹沒。

要解決這個問題,我認爲有錯誤處理,這樣,而不是擊中錯誤通道延伸FileSystemPersistentAcceptOnceFileListFilter,我們乾脆拒絕檢測,並在XD-容器日誌離開消息的所有文件,但是這是一個解決方案我不喜歡這樣做,因爲我想通過配置完全解決這個問題,並且完全避免了我們的票務/通知系統。相反,我寧願允許一個單一的發送到errorChannel(所以我們得到一個通知/票),然後停止這個模塊是一個組件(或至少,功能上相同,最好通過配置)的流。有沒有辦法做到這一點?

回答

1

由於我沒有看到自定義error-channel,我假設您的票務系統是由日誌子系統(通過默認的errorChannel及其日誌處理程序訂閱者)驅動的。

由於默認errorChannel是發佈/訂閱,您可以訂閱一個第二流它...

<int:transformer input-channel="errorChannel" expression="@fileChannelAdapter.stop()" 
    output-channel="control" /> 

<int:control-bus input-channel="control" /> 

和文件通道適配器上設置id="fileChannelAdapter"

+0

這工作完美,謝謝! 我做了一些補充,以便在恢復redis時重啓模塊:1)添加了connectionChecker bean,它將RedisConnection.ping()功能封裝到一個方便的布爾方法中。 2)添加到模塊上下文中: 「 \t \t ' –

+0

酷 - 您可能想考慮爲[spring-xd-modules] (https://github.com/spring-projects/spring-xd-modules)。 –