資源支援
資源入站通道介面卡基於 Spring 的 Resource 抽象構建,以支援各種底層資源(例如檔案、URL 或類路徑資源)的更大靈活性。因此,它與檔案入站通道介面卡類似,但更通用。
資源入站通道介面卡
資源入站通道介面卡是一個輪詢介面卡,它建立一個其有效負載是 Resource 物件集合的 Message。
Resource 物件根據 pattern 屬性指定的模式解析。然後,解析後的 Resource 物件集合作為有效負載,在 Message 中傳送到介面卡的通道。這是資源入站通道介面卡和檔案入站通道介面卡之間的一個主要區別:後者緩衝 File 物件併為每個 Message 傳送單個 File 物件。
以下示例顯示了一個簡單的配置,它查詢類路徑上 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=""。