資源支援

資源輸入通道配接器建立在 Spring 的 Resource 抽象概念之上,以支援各種實際底層資源類型的更大彈性,例如檔案、URL 或類別路徑資源。因此,它與檔案輸入通道配接器相似,但更通用。

資源輸入通道配接器

資源輸入通道配接器是一個輪詢配接器,它會建立一個 Message,其 Payload 是一個 Resource 物件的集合。

Resource 物件會根據 pattern 屬性指定的模式來解析。然後,已解析的 Resource 物件集合會作為 Message 中的 Payload 傳送到配接器的通道。這是資源輸入通道配接器和檔案輸入通道配接器之間的主要差異之一:後者會緩衝 File 物件,並為每個 Message 發送單個 File 物件。

以下範例顯示了一個簡單的設定,它會尋找類別路徑上 things.thing1 套件中所有以 'properties' 副檔名結尾的檔案,並將它們作為 Message 的 Payload 發送到名為 'resultChannel' 的通道

<int:resource-inbound-channel-adapter id="resourceAdapter"
               channel="resultChannel"
               pattern="classpath:things/thing1/*.properties">
    <int:poller fixed-rate="1000"/>
</int:resource-inbound-channel-adapter>

資源輸入通道配接器依賴 org.springframework.core.io.support.ResourcePatternResolver 策略介面來解析提供的模式。它預設為目前 ApplicationContext 的實例。但是,您可以透過設定 pattern-resolver 屬性來提供對您自己實作的 ResourcePatternResolver 實例的參考,如下列範例所示

<int:resource-inbound-channel-adapter id="resourceAdapter"
               channel="resultChannel"
               pattern="classpath:things/thing1/*.properties"
               pattern-resolver="myPatternResolver">
    <int:poller fixed-rate="1000"/>
</int:resource-inbound-channel-adapter>

<bean id="myPatternResolver" class="org.example.MyPatternResolver"/>

您可能有一個使用案例,需要進一步篩選 ResourcePatternResolver 解析的資源集合。例如,您可能想要防止已解析的資源再次出現在已解析資源的集合中。另一方面,您的資源可能會經常更新,而您 *確實* 希望它們再次被選取。換句話說,定義額外的篩選器和完全停用篩選都是有效的使用案例。您可以提供您自己實作的 org.springframework.integration.util.CollectionFilter 策略介面,如下列範例所示

public interface CollectionFilter<T> {

    Collection<T> filter(Collection<T> unfilteredElements);

}

CollectionFilter 接收未篩選元素的集合(在前面的範例中是 Resource 物件),並傳回相同類型的已篩選元素集合。

如果您使用 XML 定義配接器,但未指定篩選器參考,則資源輸入通道配接器會使用 CollectionFilter 的預設實作。該預設篩選器的實作類別是 org.springframework.integration.util.AcceptOnceCollectionFilter。它會記住先前調用中傳入的元素,以避免多次傳回這些元素。

若要注入您自己實作的 CollectionFilter,請使用 filter 屬性,如下列範例所示

<int:resource-inbound-channel-adapter id="resourceAdapter"
               channel="resultChannel"
               pattern="classpath:things/thing1/*.properties"
               filter="myFilter">
    <int:poller fixed-rate="1000"/>
</int:resource-inbound-channel-adapter>

<bean id="myFilter" class="org.example.MyFilter"/>

如果您不需要任何篩選,並且想要停用甚至預設的 CollectionFilter 策略,請為 filter 屬性提供一個空值(例如,filter=""