|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
资源支持
资源入站通道适配器构建在 Spring 的Resource抽象之上,以支持在各种实际类型的底层资源(如文件、URL 或类路径资源)上具有更大的灵活性。
因此,它类似于但比文件入站通道适配器更通用。
资源入站通道适配器
资源入站通道适配器是一个轮询适配器,它创建一个 Message,其负载是 Resource 对象的集合。
Resource 个对象是根据 pattern 属性指定的模式解析的。
然后,解析后的 Resource 对象集合作为有效负载通过 Message 发送到适配器的通道。
这是资源入站通道适配器与文件入站通道适配器之间的一个主要区别:后者对 File 对象进行缓冲,并为每个 Message 发送单个 File 对象。
以下示例展示了一个简单的配置,它会查找类路径下位于 things.thing1 包中所有以'properties'为扩展名的文件,并将它们作为有效负载发送到名为'resultChannel'的 Message:
<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);
}
The CollectionFilter 接收一组未过滤的元素(在 preceding example 中为 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="")