資源支援

資源入站通道介面卡基於 Spring 的 Resource 抽象構建,以支援對各種基礎資源(例如檔案、URL 或類路徑資源)提供更大的靈活性。因此,它類似於檔案入站通道介面卡,但更為通用。

資源入站通道介面卡

資源入站通道介面卡是一個輪詢介面卡,它建立一個有效載荷為 Resource 物件集合的 Message

Resource 物件根據 pattern 屬性指定的模式進行解析。然後將解析的 Resource 物件集合作為有效載荷在 Message 中傳送到介面卡的通道。這是資源入站通道介面卡與檔案入站通道介面卡之間的一個主要區別:後者緩衝 File 物件,並透過每個 Message 傳送一個 File 物件。

以下示例展示了一個簡單的配置,它查詢 classpath 上 available 的 things.thing1 包中所有以“properties”副檔名結尾的檔案,並將它們作為 Message 的有效載荷傳送到名為“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=""