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=""
)