Feed 介面卡

Spring Integration 透過 feed 介面卡提供對聯合釋出(syndication)的支援。該實現基於 ROME 框架

您需要在您的專案中包含此依賴項

  • Maven

  • Gradle

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

Web 聯合釋出是一種釋出材料的方式,例如新聞報道、新聞稿、部落格文章以及通常在網站上提供但也可以 feed 格式(如 RSS 或 ATOM)提供的其他專案。

Spring Integration 透過其“feed”介面卡提供對 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"

Feed 入站通道介面卡

真正提供支援以檢索 feed 的唯一介面卡是入站通道介面卡。它允許您訂閱特定的 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 例項。每個例項都封裝了關於新聞專案的各種資料(內容、日期、作者和其他詳細資訊)。

入站 feed 通道介面卡是一個輪詢消費者。這意味著您必須提供一個輪詢器配置。然而,關於 feed,您必須瞭解一件重要的事情,那就是它的內部工作方式與大多數其他輪詢消費者略有不同。當啟動一個入站 feed 介面卡時,它會執行第一次輪詢並接收一個 com.rometools.rome.feed.synd.SyndFeed 例項。該物件包含多個 SyndEntry 物件。每個條目都儲存在本地條目佇列中,並根據 max-messages-per-poll 屬性的值釋放,以便每條訊息包含一個條目。如果在從條目佇列檢索條目期間佇列變空,介面卡會嘗試更新 feed,從而用更多的條目(SyndEntry 例項)填充佇列(如果有的話)。否則,下一次輪詢 feed 的嘗試將由輪詢器的觸發器決定(在上述配置中是每十秒一次)。

重複條目

輪詢 feed 可能會導致已經處理過的條目(“我讀過那條新聞了,為什麼又給我看?”)。Spring Integration 提供了一種方便的機制來消除對重複條目的擔憂。每個 feed 條目都有一個“釋出日期”欄位。每當生成併發送新訊息時,Spring Integration 會將最新發布日期的值儲存在 MetadataStore 策略的例項中(參見 元資料儲存)。metadataKey 用於持久化最新發布日期。

其他選項

從 5.0 版本開始,已廢棄的 com.rometools.fetcher.FeedFetcher 選項已被移除,並提供了一個針對 org.springframework.core.io.Resource 的過載 FeedEntryMessageSource 建構函式。當 feed 源不是 HTTP 端點而是任何其他資源(如本地或 FTP 上的遠端資源)時,這很有用。在 FeedEntryMessageSource 的邏輯中,此類資源(或提供的 URL)由 SyndFeedInput 解析為 SyndFeed 物件,以便進行前面提到的處理。您還可以將定製的 SyndFeedInput 例項(例如,帶有 allowDoctypes 選項)注入到 FeedEntryMessageSource 中。

如果與 feed 的連線需要一些定製,例如連線和讀取超時,則必須使用帶有其 customizeConnection(HttpURLConnection) 重寫方法的 org.springframework.core.io.UrlResource 擴充套件,而不是將純 URL 直接注入到 FeedEntryMessageSource 中。例如

@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");
}