Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
您将如何在JavaWeb环境中实现RSS提要?_Java_Servlets_Rss - Fatal编程技术网

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

您将如何在JavaWeb环境中实现RSS提要?,java,servlets,rss,Java,Servlets,Rss,我正在为协作平台开发RSS提要的实现。 假设有数千个不同的协作室,用户可以在其中共享信息,每个协作室都需要发布包含新闻、更改等内容的RSS提要 使用普通的servlet(即)成本很高,每次RSS客户端调用servlet时(对于在数千个房间中注册到RSS提要的每个用户来说,每10分钟就会发生一次),这将触发整个servlet生命周期,成本很高 另一方面,在硬盘空间和IO操作方面,在磁盘上为数千个房间中的每个房间保存一个静态XML文件也很昂贵 还有一个限制-使用现有的框架可能不是一个选项 那么,您将

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

使用普通的servlet(即)成本很高,每次RSS客户端调用servlet时(对于在数千个房间中注册到RSS提要的每个用户来说,每10分钟就会发生一次),这将触发整个servlet生命周期,成本很高

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

还有一个限制-使用现有的框架可能不是一个选项


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

您应该试试这个框架。这对于RSS来说非常好。

您说对servlet的新http请求“将触发整个servlet生命周期”,正如Alexander已经指出的,这并不完全正确。它只会触发对
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响应所需的整个对象图。如果我正确地阅读了您的原始问题,那么我认为这就是您希望实现的目标。

就像我添加到问题中的一样,外部框架是不可能的。。。你知道他们是如何实现的吗?为什么你说每个RSS请求都会触发整个servlet生命周期。通常,servlet将初始化一次,然后保持活动状态,直到容器终止。请求唯一会触发的是servlet处理请求的方法。Matt感谢您的详细回答。考虑到RSS响应肯定会被缓存,问题在于基于servlet的整个RSS机制的性能。在你看来,这个servlet会支持我所说的数字吗?@Yuval:为什么你认为调用servlet方法必然比从磁盘返回文件慢?事实上,Tomcat和其他人也使用servlet(DefaultServlet)来服务静态文件。我在这里编写了这样一个servlet: