Spring集成:如何读取多个RSS频道?
我写了一个阅读RSS提要的应用程序。它与beans.xml中的一个频道配合使用,如下所示: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
<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克隆