フィードアダプター

Spring Integration は、フィードアダプターを介したシンジケーションのサポートを提供します。実装は ROME フレームワーク (英語) に基づいています。

この依存関係をプロジェクトに含める必要があります。

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-feed</artifactId>
    <version>6.3.1</version>
</dependency>
compile "org.springframework.integration:spring-integration-feed:6.3.1"

Web シンジケーションは、ニュース記事、プレスリリース、ブログ投稿、その他の Web サイトで一般的に利用可能な資料を公開する方法ですが、RSS や ATOM などのフィード形式でも利用できます。

Spring 統合は、その「フィード」アダプターを介して Web シンジケーションをサポートし、便利な名前空間ベースの構成を提供します。'feed' 名前空間を構成するには、XML 構成ファイルのヘッダー内に次の要素を含めます。

xmlns:int-feed="http://www.springframework.org/schema/integration/feed"
xsi:schemaLocation="http://www.springframework.org/schema/integration/feed
	https://www.springframework.org/schema/integration/feed/spring-integration-feed.xsd"

フィード受信チャネルアダプター

フィードの取得をサポートするために本当に必要な唯一のアダプターは、受信チャネルアダプターです。特定の URL にサブスクライブできます。次の例は、可能な構成を示しています。

  • Java DSL

  • Java

  • XML

@Configuration
@EnableIntegration
public class ContextConfiguration {

    @Value("org/springframework/integration/feed/sample.rss")
    private Resource feedResource;

    @Bean
    public IntegrationFlow feedFlow() {
        return IntegrationFlow
                .from(Feed.inboundAdapter(this.feedResource, "feedTest")
                                .preserveWireFeed(true),
                        e -> e.poller(p -> p.fixedDelay(100)))
                .channel(c -> c.queue("entries"))
                .get();
    }

}
@Bean
@InboundChannelAdapter(inputChannel = "fromFeed")
public FeedEntryMessageSource feedEntrySource() {
    return new FeedEntryMessageSource("https://feeds.bbci.co.uk/news/rss.xml", "metadataKey");
}
<int-feed:inbound-channel-adapter id="feedAdapter"
        channel="feedChannel"
        url="https://feeds.bbci.co.uk/news/rss.xml">
    <int:poller fixed-rate="10000" max-messages-per-poll="100" />
</int-feed:inbound-channel-adapter>

上記の構成では、url 属性によって識別される URL にサブスクライブしています。

ニュース項目が取得されると、それらはメッセージに変換され、channel 属性によって識別されるチャネルに送信されます。各メッセージのペイロードは com.rometools.rome.feed.synd.SyndEntry インスタンスです。それぞれがニュースアイテムに関するさまざまなデータ(コンテンツ、日付、作成者、その他の詳細)をカプセル化します。

受信 フィードチャネルアダプターは、ポーリングコンシューマーです。つまり、ポーラー構成を提供する必要があります。ただし、フィードに関して理解しなければならない重要な点の 1 つは、フィードの内部動作が他のほとんどのポーリングコンシューマーとは少し異なるということです。受信 フィードアダプターが開始されると、最初のポーリングが実行され、com.rometools.rome.feed.synd.SyndFeed インスタンスが受信されます。そのオブジェクトには、複数の SyndEntry オブジェクトが含まれています。各エントリはローカルエントリキューに格納され、各メッセージに 1 つのエントリが含まれるように、max-messages-per-poll 属性の値に基づいて解放されます。エントリキューからのエントリの取得中にキューが空になった場合、アダプターはフィードを更新しようとします。これにより、利用可能なエントリ (SyndEntry インスタンス) がキューに追加されます。それ以外の場合、フィードのポーリングの次の試行は、ポーラーのトリガーによって決定されます (上記の構成では 10 秒ごと)。

重複エントリ

フィードをポーリングすると、すでに処理されたエントリが返される場合があります (「そのニュース項目はすでに読みましたが、なぜもう一度表示するのですか ? 」)。Spring Integration は、エントリの重複を心配する必要をなくすための便利なメカニズムを提供します。各フィードエントリには「公開日」フィールドがあります。新しい Message が生成されて送信されるたびに、Spring Integration は最新の発行日の値を MetadataStore 戦略のインスタンスに格納します ( メタデータストアを参照)。metadataKey は、最新の発行日を保持するために使用されます。

その他のオプション

バージョン 5.0 から、非推奨の com.rometools.fetcher.FeedFetcher オプションが削除され、org.springframework.core.io.Resource のオーバーロードされた FeedEntryMessageSource コンストラクターが提供されます。これは、フィードソースが HTTP エンドポイントではなく、他のリソース(FTP 上のローカルまたはリモートなど)である場合に役立ちます。FeedEntryMessageSource ロジックでは、そのようなリソース(または提供された URL)は、前述の処理のために SyndFeedInput によって SyndFeed オブジェクトに解析されます。また、カスタマイズされた SyndFeedInput (たとえば、allowDoctypes オプションを使用)インスタンスを FeedEntryMessageSource に挿入することもできます。

フィードへの接続にカスタマイズが必要な場合。接続と読み取りのタイムアウトでは、FeedEntryMessageSource へのプレーンな URL インジェクションの代わりに、customizeConnection(HttpURLConnection) オーバーライドを備えた org.springframework.core.io.UrlResource 拡張機能を使用する必要があります。例:

@Bean
@InboundChannelAdapter("feedChannel")
FeedEntryMessageSource feedEntrySource() {
    UrlResource urlResource =
	    new UrlResource(url) {

	        @Override
	        protected void customizeConnection(HttpURLConnection connection) throws IOException {
	            super.customizeConnection(connection);
	            connection.setConnectTimeout(10000);
	            connection.setReadTimeout(5000);
	        }
	    };
    return new FeedEntryMessageSource(urlResource, "myKey");
}