我正在为一个协作平台的RSS提要实现工作。假设有数千个不同的协作室,用户可以在其中共享信息,每个协作室都需要发布一个包含新闻、更改等内容的RSS提要。
使用普通的servlet (即http://www.site.com/RSSServlet/?id=roomID)成本很高,每次RSS客户端调用servlet (对于注册到数千个房间中的一个上的RSS的每个用户来说,这将每隔10分钟发生一次),这将触发整个servlet生命周期,这是昂贵的。
另一方面,在硬盘空间和IO操作方面,在磁盘上为数千个房间中的每个房间保留一个静态XML文件的成本也很高……
还有一个限制--使用已经存在的框架可能不是一个选择……
那么,如何在Java环境中实现RSS提要呢?
发布于 2008-10-14 17:16:50
您说对servlet的新http请求“将触发整个servlet生命周期”,但Alexander已经指出,这并不完全正确。它只会触发对doGet()或doPost()方法的另一个方法调用。
我认为您的意思是,如果您有一个doGet/doPost方法,其中包含从头开始构建RSS提要所需的数据的代码,那么每个请求都会一次又一次地触发这种数据获取。
如果这是您关心的问题,并且您排除了静态内容,那么只需修改Servlet /doPost方法来缓存否则将返回的doGet内容,以便处理每个请求并不意味着重新获取所有数据。
例如
public void doGet(HttpServletRequest request, HttpServletResponse response) {
//build the objects you need for the RSS response
Room room = getRoom(request.getParameter("roomid"));
//loadData();
//moreMethodCalls();
out.println( createRssContent(...) );
}变成了
Map rssCache;
public void doGet(HttpServletRequest request, HttpServletResponse response) {
//Map is initialized in the init() method or somewhere else
String roomId = request.getParameter("roomid");
String rssDocument = rssCache.get(roomId);
if (rssDocument == null) {
//build the objects you need for the RSS response
Room room = getRoom(roomId);
//loadData();
//moreMethodCalls();
rssDocument = createRssContent(...);
rssCache.put(roomId, rssDocument);
}
out.println( rssDocument );
}如果您只想在“缓存”中存储项目一段时间,您可以使用十几个不同的缓存框架中的一个,但这里的想法是,您不需要为每个http请求重新构建RSS响应所需的整个对象图。如果我没看错你的原始问题,那么我认为这就是你希望实现的目标。
发布于 2008-10-12 14:44:18
您应该尝试一下ROME框架。它对于RSS来说是非常好的。
https://stackoverflow.com/questions/195537
复制相似问题