Spring集成:如何读取多个RSS频道?

Spring集成:如何读取多个RSS频道?,rss,spring-integration,Rss,Spring Integration,我写了一个阅读RSS提要的应用程序。它与beans.xml中的一个频道配合使用,如下所示: <feed:inbound-channel-adapter id="news" channel="inputRssFeedChannel" url="http://feeds.feedburner.com/Techcrunch"> <in

我写了一个阅读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的Rshandler。但是,如果我想阅读一些rss URL(2、5、20等),我该怎么办?

创建自己的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>

http://www.gridshore.nl/feed/
https://spring.io/blog.atom
http://feeds.foxnews.com/foxnews/video?format=xml
NewsReader类使用URL proprity中提到的列表并检索提要。 请参考下面的接收方法

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;
    }
public类新闻阅读器实现MessageSource,初始化bean{
私有静态记录器Logger=LoggerFactory.getLogger(newreader.class);
私有FeedFetcherCache feedInfoCache;
专用FeedFetcher FeedFetcher;
私有FetcherListener FetcherListener;
私有列表URL;
@凌驾
公共消息接收(){
列表提要=获取提要项();
返回MessageBuilder.withPayload(提要)
.setHeader(“feedid”、“newsfeed”).build();
}
获取的私有列表FeedItems(){
列表提要=新的ArrayList();
试一试{
for(字符串url:url){
feed.add(feedFetcher.retrieveFeed(新的URL));
}
}捕获(IOE异常){
logger.error(“检索提要时出现IO问题”,e);
}捕获(FEEDE){
错误(“检索提要时提要问题”,e);
}捕获(获取异常e){
logger.error(“检索提要时出现取回器问题”,e);
}
回馈;
}
@凌驾
public void afterPropertieSet()引发异常{
feedInfoCache=HashMapFeedInfoCache.getInstance();
feedFetcher=新的HttpURLFeedFetcher(feedInfoCache);
if(fetcherListener!=null){
feedFetcher.addFetcherEventListener(fetcherListener);
}
}
public void setFetcherListener(FetcherListener FetcherListener){
this.fetcherListener=fetcherListener;
}
公共无效设置URL(列出URL){
this.url=url;
}
如果您想查看我的完整代码:

git克隆