资源支持

资源入站通道适配器建立在 Spring 的Resource抽象之上,以支持各种实际类型的底层资源(例如文件、URL 或类路径资源)的更大灵活性。因此,它类似于但比文件入站通道适配器更通用。

资源入站通道适配器

资源入站通道适配器是一个轮询适配器,它创建一个其有效负载是Resource对象集合的Message

Resource对象是根据pattern属性指定的模式解析的。然后将解析的Resource对象集合作为有效负载发送到适配器的通道中。这是资源入站通道适配器和文件入站通道适配器之间的一个主要区别:后者缓冲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="")。