Feed 介面卡
Spring Integration 透過 Feed 介面卡提供對聯合釋出的支援。此實現基於 ROME 框架。
專案需要此依賴項
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-feed</artifactId>
<version>7.0.0</version>
</dependency>
compile "org.springframework.integration:spring-integration-feed:7.0.0"
網路聯合釋出是一種釋出新聞故事、新聞稿、部落格文章以及通常在網站上可用但同時以 RSS 或 ATOM 等 Feed 格式提供的其他內容的方式。
Spring Integration 透過其“feed”介面卡提供對網路聯合釋出的支援,併為其提供方便的基於名稱空間的配置。要配置“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 條目都有一個“釋出日期”欄位。每次生成併發送新 Message 時,Spring Integration 都會將最新發布日期的值儲存在 MetadataStore 策略的例項中(參見 Metadata Store)。metadataKey 用於持久化最新發布日期。
其他選項
從版本 5.0 開始,已棄用的 com.rometools.fetcher.FeedFetcher 選項已被移除,並提供了一個針對 org.springframework.core.io.Resource 的過載 FeedEntryMessageSource 建構函式。當 Feed 源不是 HTTP 端點而是任何其他資源(例如本地或 FTP 上的遠端資源)時,這很有用。在 FeedEntryMessageSource 邏輯中,此類資源(或提供的 URL)由 SyndFeedInput 解析為 SyndFeed 物件,以進行前面提到的處理。您還可以將自定義的 SyndFeedInput(例如,帶有 allowDoctypes 選項)例項注入到 FeedEntryMessageSource 中。
|
如果 Feed 連線需要一些自定義,例如連線和讀取超時,則必須使用
|