# 资源支持

## 资源支持

资源入站通道适配器基于 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=""`）