饲料适配器

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

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

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

Web 联合是一种发布材料的方式,例如新闻故事、新闻稿、博客文章和其他通常在网站上可用但也以 RSS 或 ATOM 等提要格式提供的项目。

Spring 集成通过其 'feed' 适配器为 Web 联合提供支持,并为其提供方便的基于名称空间的配置。要配置“提要”命名空间,请在 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 入站通道适配器

您真正需要为检索提要提供支持的唯一适配器是入站通道适配器。它允许您订阅特定的 URL。以下示例显示了一种可能的配置:

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

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

重复条目

对提要进行轮询可能会导致条目已被处理(“我已经阅读了该新闻项目,您为什么还要向我显示它?”)。Spring Integration 提供了一种方便的机制来消除对重复条目的担心。每个提要条目都有一个“发布日期”字段。每次Message生成和发送新的时,Spring Integration 都会将最新发布日期的值存储在MetadataStore策略实例中(请参阅元数据存储)。

用于保持最新发布日期的键是id馈送入站通道适配器组件的(必需)属性的值加上feedUrl适配器配置中的(如果有的话)。

其他选项

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

如果与提要的连接需要一些自定义,例如连接和读取超时,则必须使用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");
}

Java DSL 配置

以下 Spring Boot 应用程序显示了如何使用 Java DSL 配置入站适配器的示例:

@SpringBootApplication
public class FeedJavaApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(FeedJavaApplication.class)
            .web(false)
            .run(args);
    }

    @Value("org/springframework/integration/feed/sample.rss")
    private Resource feedResource;

    @Bean
    public MetadataStore metadataStore() {
        PropertiesPersistingMetadataStore metadataStore = new PropertiesPersistingMetadataStore();
        metadataStore.setBaseDirectory(tempFolder.getRoot().getAbsolutePath());
        return metadataStore;
    }

    @Bean
    public IntegrationFlow feedFlow() {
        return IntegrationFlows
                .from(Feed.inboundAdapter(this.feedResource, "feedTest")
                                .metadataStore(metadataStore()),
                        e -> e.poller(p -> p.fixedDelay(100)))
                .channel(c -> c.queue("entries"))
                .get();
    }

}

1. see XML Configuration