馈送适配器

Spring Integration 通过 feed 适配器提供对联合的 支持。实现基于 ROME 框架.

您需要将此依赖项包含到您的项目中

  • Maven

  • Gradle

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

网络联合是一种发布材料的方式,例如新闻报道、新闻稿、博客文章和其他通常在网站上提供但也可以以 feed 格式(如 RSS 或 ATOM)提供的项目。

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实例。每个实例封装了关于新闻项目的各种数据(内容、日期、作者和其他详细信息)。

入站馈送通道适配器是一个轮询消费者。这意味着您必须提供轮询器配置。但是,关于馈送,您必须了解的一件重要事情是,它的内部工作方式略有不同,然后大多数其他轮询消费者。当入站馈送适配器启动时,它会执行第一次轮询并接收一个com.rometools.rome.feed.synd.SyndFeed实例。该对象包含多个SyndEntry对象。每个条目都存储在本地条目队列中,并根据max-messages-per-poll属性中的值释放,这样每个消息都包含一个条目。如果在从条目队列中检索条目期间,队列已变为空,则适配器尝试更新馈送,从而使用更多条目(SyndEntry实例)填充队列(如果有)。否则,下次尝试轮询馈送的时间由轮询器的触发器决定(在前面的配置中每十秒一次)。

重复条目

轮询馈送可能会导致已经处理过的条目(“我已经读过那条新闻,为什么你还要再给我看?”)。Spring Integration 提供了一种方便的机制来消除对重复条目的担忧。每个馈送条目都有一个“发布日期”字段。每次生成并发送新的Message时,Spring Integration 会将最新发布日期的值存储在MetadataStore策略的实例中(参见 元数据存储)。metadataKey用于持久化最新的发布日期。

其他选项

从 5.0 版本开始,已弃用的 `com.rometools.fetcher.FeedFetcher` 选项已被移除,并提供了一个重载的 `FeedEntryMessageSource` 构造函数,用于 `org.springframework.core.io.Resource`。当 feed 源不是 HTTP 端点,而是任何其他资源(例如本地或 FTP 上的远程资源)时,这很有用。在 `FeedEntryMessageSource` 逻辑中,此类资源(或提供的 `URL`)将由 `SyndFeedInput` 解析为 `SyndFeed` 对象,用于前面提到的处理。您也可以将自定义的 `SyndFeedInput`(例如,使用 `allowDoctypes` 选项)实例注入到 `FeedEntryMessageSource` 中。

如果连接到 feed 需要一些自定义,例如连接和读取超时,则必须使用 `org.springframework.core.io.UrlResource` 扩展及其 `customizeConnection(HttpURLConnection)` 覆盖,而不是将普通的 `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");
}