Resource Support

资源入站频道适配器以 Spring 的 Resource 抽象为基础,以支持对各种实际类型的底层资源(例如文件、URL 或类路径资源)的更强的灵活性。因此,它类似于文件入站通道适配器,但比其更加通用。

Resource Inbound Channel Adapter

资源入站频道适配器是一种轮询适配器,用于创建一个 Message,其有效载荷是 Resource 对象的集合。

Resource 对象基于 pattern 属性指定的形式解决。然后将已解析的 Resource 对象的集合作为有效载荷发送到适配器的通道中的 Message。这是资源入站通道适配器和文件入站通道适配器之间的一个主要差异:后者缓冲 File 对象并每个 Message 发送一个 File 对象。

以下示例显示了一个简单配置,该配置查找 classpath 上的 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=""