资源支持
资源入站通道适配器基于Spring的Resource抽象构建,以支持对各种实际类型的底层资源(例如文件、URL或类路径资源)提供更大的灵活性。因此,它与文件入站通道适配器类似,但更为通用。
资源入站通道适配器
资源入站通道适配器是一种轮询适配器,它会创建一个Message,其有效载荷是Resource对象的集合。
Resource 对象根据 pattern 属性指定的模式进行解析。解析后的 Resource 对象集合随后作为有效负载在 Message 中发送到适配器的通道。这是资源入站通道适配器与文件入站通道适配器之间的一个主要区别:后者会缓冲 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 属性提供一个空值,例如 filter=""。