资源支持
资源传入通道适配器基于 Spring 的 Resource
抽象,以支持各种实际类型的底层资源(如文件、URL 或类路径资源)的更大灵活性。因此,它与文件传入通道适配器类似,但更为通用。
资源入站通道适配器
资源入站通道适配器是一个轮询适配器,它创建一个 Message
,其有效负载是 Resource
对象的集合。
Resource
对象根据 pattern
属性指定的模式进行解析。解析后的 Resource
对象集合将作为有效负载包含在 Message
中发送到适配器的通道。这就是资源入站通道适配器和文件入站通道适配器之间的一个主要区别:后者缓冲 File
对象,并且每次发送一个 File
对象到 Message
。
以下示例展示了一个简单的配置,该配置会查找类路径上 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);
}
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=""
)