23. Resource Support

23.1 Introduction

The Resource Inbound Channel Adapter builds upon Spring's Resource abstraction to support greater flexibility across a variety of actual types of underlying resources, such as a file, a URL, or a class path resource. Therefore, it's similar to but more generic than the File Inbound Channel Adapter.

23.2 Resource Inbound Channel Adapter

The Resource Inbound Channel Adapter is a polling adapter that creates a Message whose payload is a collection of Resource objects.

Resource objects are resolved based on the pattern specified using the pattern attribute. The collection of resolved Resource objects is then sent as a payload within a Message to the adapter's channel. That is one major difference between Resource Inbound Channel Adapter and File Inbound Channel Adapter; the latter buffers File objects and sends a single File object per Message.

Below is an example of a very simple configuration which will find all files ending with the 'properties' extension in the foo.bar package available on the classpath and will send them as the payload of a Message to the channel named 'resultChannel':

<int:resource-inbound-channel-adapter id="resourceAdapter"
               channel="resultChannel" 
               pattern="classpath:foo/bar/*.properties">
    <int:poller fixed-rate="1000"/>
</int:resource-inbound-channel-adapter>

The Resource Inbound Channel Adapter relies on the org.springframework.core.io.support.ResourcePatternResolver strategy interface to resolve the provided pattern. It defaults to an instance of the current ApplicationContext. However you may provide a reference to an instance of your own implementation of ResourcePatternResolver using the pattern-resolver attribute:

<int:resource-inbound-channel-adapter id="resourceAdapter"
               channel="resultChannel" 
               pattern="classpath:foo/bar/*.properties"
               pattern-resolver="myPatternResolver">
    <int:poller fixed-rate="1000"/>
</int:resource-inbound-channel-adapter>

<bean id="myPatternResolver" class="org.example.MyPatternResolver"/>

You may have a use case where you need to further filter the collection of resources resolved by the ResourcePatternResolver. For example, you may want to prevent resources that were resolved already from appearing in a collection of resolved resources ever again. On the other hand your resources might be updated rather often and you do want them to be picked up again. In other words there is a valid use case for defining an additional filter as well as disabling filtering altogether. You can provide your own implementation of the org.springframework.integration.util.CollectionFilter strategy interface:

public interface CollectionFilter<T> {

    Collection<T> filter(Collection<T> unfilteredElements);

}

As you can see the CollectionFilter receives a collection of un-filtered elements (which would be Resource objects in this case), and it returns a collection of filtered elements of that same type.

If you are defining the adapter via XML but you do not specify a filter reference, a default implementation of CollectionFilter will be used by the Resource Inbound Channel Adapter. The implementation class of that default filter is org.springframework.integration.util.AcceptOnceCollectionFilter. It remembers the elements passed in the previous invocation in order to avoid returning those elements more than once.

To inject your own implementation of CollectionFilter instead, use the filter attribute.

<int:resource-inbound-channel-adapter id="resourceAdapter"
               channel="resultChannel" 
               pattern="classpath:foo/bar/*.properties"
               filter="myFilter">
    <int:poller fixed-rate="1000"/>
</int:resource-inbound-channel-adapter>

<bean id="myFilter" class="org.example.MyFilter"/>

If you don't need any filtering and want to disable even the default CollectionFilter strategy, simply provide an empty value for the filter attribute (e.g., filter="")