资源支持

资源入站通道适配器基于 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=""