此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1! |
资源支持
资源入站通道适配器建立在 Spring 的Resource
抽象,以支持跨各种实际类型的底层资源(例如文件、URL 或类路径资源)具有更大的灵活性。
因此,它类似于文件入站通道适配器,但比文件入站通道适配器更通用。
资源入站通道适配器
资源入站通道适配器是一个轮询适配器,它创建了Message
其有效负载是Resource
对象。
Resource
对象是根据pattern
属性。
已解决的集合Resource
然后,对象将作为有效负载发送到Message
到适配器的通道。
这是资源入站通道适配器和文件入站通道适配器之间的一个主要区别:后者缓冲区File
对象并发送单个File
对象Message
.
以下示例显示了一个简单的配置,该配置在things.thing1
包,并将它们作为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
.
但是,您可以提供对您自己的实现实例的引用ResourcePatternResolver
通过将pattern-resolver
属性,如以下示例所示:
<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=""
)