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 连接需要一些自定义,例如连接和读取超时,则必须使用
|