您将如何在Java Web环境中实现RSS提要?

时间:2008-10-12 14:15:36

标签: java servlets rss

我正在为协作平台开发RSS feed的实现。 假设有数千个不同的协作室,用户可以在其中共享信息,每个协作室都需要发布带有新闻,更改等的RSS源...

每次RSS客户端调用servlet时,使用普通的servlet(即http://www.site.com/RSSServlet/?id=roomID)都是昂贵的(对于注册到RSS源中的每一个上的每个用户,每10分钟就会发生一次这将触发整个servlet生命周期,这是昂贵的。

另一方面,在硬盘空间和IO操作方面,为数千个房间中的每个房间保留静态XML文件也是昂贵的......

另一个限制 - 使用已有的框架可能不是一个选项...

那么,您将如何在Java envoronment中实现RSS提要?

2 个答案:

答案 0 :(得分:4)

你说对你的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(...) );
}

变为

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响应。如果我正在阅读您原来的问题,那么我认为这就是您希望实现的目标。

答案 1 :(得分:3)

您应该尝试ROME框架。它非常适合RSS。