リソースサポート
リソース受信チャネルアダプターは、Spring の Resource
抽象化に基づいて構築され、ファイル、URL、クラスパスリソースなど、さまざまな実際の基になるリソース全体の柔軟性を高めます。ファイル受信チャネルアダプターに似ていますが、より一般的です。
リソース受信チャネルアダプター
リソース受信チャネルアダプターは、Resource
オブジェクトのコレクションをペイロードとする Message
を作成するポーリングアダプターです。
Resource
オブジェクトは、pattern
属性で指定されたパターンに基づいて解決されます。解決された Resource
オブジェクトのコレクションは、Message
内のペイロードとしてアダプターのチャネルに送信されます。これは、リソース受信チャネルアダプターとファイル受信チャネルアダプターの大きな違いの 1 つです。後者は、File
オブジェクトをバッファーに入れ、Message
ごとに単一の File
オブジェクトを送信します。
次の例は、クラスパスで使用可能な things.thing1
パッケージの "properties" 拡張子で終わるすべてのファイルを検索し、"resultChannel" という名前のチャネルに Message
のペイロードとして送信する単純な構成を示しています。
<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=""
)