我正在为协作平台实现 RSS 提要。假设有数千个不同的协作室,用户可以在其中共享信息,并且每个协作室都需要发布包含新闻、更改等的 RSS 提要...
使用普通 servlet(即http://www.site.com/RSSServlet/?id=roomID)成本很高,每次 RSS 客户端调用 servlet 时(对于每个注册到RSS 提要在数千个房间中的一个)这将触发整个 servlet 生命周期,这是昂贵的。
另一方面,就硬盘空间和 IO 操作而言,在磁盘上为数千个房间中的每一个都保留一个静态 XML 文件也很昂贵……
还有一个限制 - 使用现有的框架可能不是一种选择......
那么,您将如何在 Java 环境中实现 RSS 提要?
您说对您的 servlet 的新 http 请求“将触发整个 servlet 生命周期”,正如亚历山大已经指出的那样,这并不完全正确。它只会触发对您的doGet()或doPost()方法的另一个方法调用。
我想你的意思是,如果你有一个doGet/doPost方法,它包含从头开始构建 RSS 提要所需数据的代码,那么每个请求都会一遍又一遍地触发这种数据获取。
如果这是您的顾虑,并且您正在排除静态内容,只需修改您的 Servlet doGet/doPost方法以缓存您将要返回的 RSS 内容,这样处理每个请求并不意味着重新获取所有数据。
例如
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(...) );
}
Run Code Online (Sandbox Code Playgroud)
变成
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 );
}
Run Code Online (Sandbox Code Playgroud)
如果您只想将项目存储在“缓存”中一段时间,您可以使用十几种不同的缓存框架中的一种,但这里的想法是您不重建 RSS 响应所需的整个对象图每个http请求。如果我正在阅读您的原始问题,那么我认为这就是您希望完成的。
| 归档时间: |
|
| 查看次数: |
5707 次 |
| 最近记录: |