【问题标题】:Spring Integration: how to read multiple RSS channels?Spring Integration:如何读取多个 RSS 频道?
【发布时间】:2016-02-06 21:18:25
【问题描述】:

我编写了读取 RSS 提要的应用程序。它适用于我在 beans.xml 中的一个通道,如下所示:

<feed:inbound-channel-adapter id="news"
                                  channel="inputRssFeedChannel"
                                  url="http://feeds.feedburner.com/Techcrunch">
        <int:poller fixed-rate="5000" max-messages-per-poll="100"/>
    </feed:inbound-channel-adapter>

    <int:service-activator input-channel="inputRssFeedChannel"
                           ref="rssPrintOutService"
                           method="printRss"
                           output-channel="nullChannel"/>

每次它只调用处理 SyndEntry 的 RssHandler。但是,如果我想阅读几个 rss 网址(2、5、20 等...),我该怎么办?

【问题讨论】:

    标签: rss spring-integration


    【解决方案1】:

    创建您自己的 org.springframework.integration.core.MessageSource 实现并在输入通道参考中使用它,如下所示:

    <int:inbound-channel-adapter id="newsInput" ref="newsReader">
            <int:poller fixed-rate="1" time-unit="SECONDS" max-messages-per-poll="1"/>
        </int:inbound-channel-adapter>
    
        <bean id="newsReader" class="blog.NewsReader">
            <property name="fetcherListener">
                <bean class="blog.helper.FetcherEventListenerImpl"/>
            </property>
            <property name="urls">
                <list>
                    <value>http://www.gridshore.nl/feed/</value>
                    <value>https://spring.io/blog.atom</value>
                    <value>http://feeds.foxnews.com/foxnews/video?format=xml</value>
                </list>
            </property>
        </bean>
    

    NewsReader 类使用 urls 适当性中提到的列表并检索提要。 请参考下面的接收方法。

    public class NewsReader implements MessageSource, InitializingBean {
        private static Logger logger = LoggerFactory.getLogger(NewsReader.class);
        private FeedFetcherCache feedInfoCache;
        private FeedFetcher feedFetcher;
        private FetcherListener fetcherListener;
        private List<String> urls;
    
        @Override
        public Message receive() {
            List<SyndFeed> feeds = obtainFeedItems();
            return MessageBuilder.withPayload(feeds)
                    .setHeader("feedid", "newsfeed").build();
        }
    
        private List<SyndFeed> obtainFeedItems() {
            List<SyndFeed> feed = new ArrayList<>();
            try {
                for (String url : urls) {
                    feed.add(feedFetcher.retrieveFeed(new URL(url)));
                }
            } catch (IOException e) {
                logger.error("IO Problem while retrieving feed", e);
            } catch (FeedException e) {
                logger.error("Feed Problem while retrieving feed", e);
            } catch (FetcherException e) {
                logger.error("Fetcher Problem while retrieving feed", e);
            }
            return feed;
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            feedInfoCache = HashMapFeedInfoCache.getInstance();
            feedFetcher = new HttpURLFeedFetcher(feedInfoCache);
            if (fetcherListener != null) {
                feedFetcher.addFetcherEventListener(fetcherListener);
            }
        }
    
        public void setFetcherListener(FetcherListener fetcherListener) {
            this.fetcherListener = fetcherListener;
        }
    
        public void setUrls(List<String> urls) {
            this.urls = urls;
        }
    

    如果你想看看我的完整代码:

    git 克隆https://github.com/BikashShaw/MultipleRSSFeedRead.git

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 2017-05-05
      • 2021-01-31
      • 2016-10-24
      • 2019-10-16
      • 2015-07-02
      相关资源
      最近更新 更多