# 资源支持
# 资源支持
资源入站通道适配器基于 Spring 的Resource
抽象,以支持跨各种实际类型的底层资源(例如文件、URL 或类路径资源)的更大灵活性。因此,它与文件入站通道适配器类似,但更通用。
# 资源入站通道适配器
资源入站通道适配器是一个轮询适配器,它创建一个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=""
)