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 的連線需要一些定製,例如連線和讀取超時,則必須使用帶有其
|