此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.4spring-doc.cn

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.4spring-doc.cn

Spring 集成通过Feed适配器提供对联合的支持。 该实现基于 ROME 框架spring-doc.cn

您需要将此依赖项包含在您的项目中:spring-doc.cn

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

Web 联合是一种发布材料(如新闻报道、新闻稿、博客文章和其他项目)的方法,这些材料通常在网站上提供,但也以 RSS 或 ATOM 等源格式提供。spring-doc.cn

Spring 集成通过其“feed”适配器提供对 Web 联合的支持,并为其提供方便的基于名称空间的配置。 要配置 'feed' 命名空间,请在 XML 配置文件的标头中包含以下元素:spring-doc.cn

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。 以下示例显示了可能的配置:spring-doc.cn

@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。urlspring-doc.cn

检索新闻项时,它们将转换为消息并发送到由属性标识的通道。 每条消息的 payload 都是一个实例。 每个 API 都封装了有关新闻项的各种数据(内容、日期、作者和其他详细信息)。channelcom.rometools.rome.feed.synd.SyndEntryspring-doc.cn

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

重复条目

轮询 Feed 可能会导致条目已被处理(“我已经阅读了该新闻项,为什么还要再次向我显示它? Spring 集成提供了一种方便的机制,无需担心重复的条目。 每个 Feed 条目都有一个 “published date” 字段。 每次生成和发送新日期时, Spring 集成都会将最新发布日期的值存储在策略的实例中(参见元数据存储)。 这用于保留最新发布日期。MessageMetadataStoremetadataKeyspring-doc.cn

其他选项

从版本 5.0 开始,已删除 deprecated 选项,并提供了 an 的重载构造函数。 当源源不是 HTTP 端点而是任何其他资源(如 FTP 上的 local 或 remote)时,这非常有用。 在逻辑中,这样的资源(或提供的)由 解析到对象以进行前面提到的处理。 您还可以将自定义(例如,使用 option)实例注入到 .com.rometools.fetcher.FeedFetcherFeedEntryMessageSourceorg.springframework.core.io.ResourceFeedEntryMessageSourceURLSyndFeedInputSyndFeedSyndFeedInputallowDoctypesFeedEntryMessageSourcespring-doc.cn

如果与 feed 的连接需要一些自定义,例如连接和读取超时,则必须使用扩展及其覆盖,而不是直接注入到 . 例如:org.springframework.core.io.UrlResourcecustomizeConnection(HttpURLConnection)URLFeedEntryMessageSourcespring-doc.cn

@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");
}

如果与 feed 的连接需要一些自定义,例如连接和读取超时,则必须使用扩展及其覆盖,而不是直接注入到 . 例如:org.springframework.core.io.UrlResourcecustomizeConnection(HttpURLConnection)URLFeedEntryMessageSourcespring-doc.cn

@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");
}