Как бы вы реализовали RSS-канал в веб-среде Java? - PullRequest
2 голосов
/ 12 октября 2008

Я работаю над реализацией RSS-каналов для платформы совместной работы. Скажем, есть несколько тысяч различных комнат для совместной работы, где пользователи могут делиться информацией, и каждая из них должна опубликовать RSS-канал с новостями, изменениями и т. Д ...

Использование простого сервлета (т. Е. http://www.site.com/RSSServlet/?id=roomID) обходится дорого, каждый раз, когда клиент RSS вызывает сервлет (и это будет происходить, скажем, каждые 10 минут для каждого пользователя, зарегистрированного в ленте RSS на одной из тысячи комнат), это запустит весь жизненный цикл сервлета, что дорого.

С другой стороны, хранение статического XML-файла на диске для каждой из тысяч комнат также является дорогостоящим с точки зрения места на жестком диске и операций ввода-вывода ...

Еще одно ограничение - использование уже существующих фреймворков может оказаться невозможным ...

Итак, как бы вы реализовали RSS-каналы в среде Java?

Ответы [ 2 ]

4 голосов
/ 14 октября 2008

Вы говорите, что новый http-запрос к вашему сервлету «запустит весь жизненный цикл сервлета», что, как уже указывал Александр, не совсем верно. Это просто вызовет другой вызов метода к вашим 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 );
}

Если вы хотите хранить элементы в «кэше» только определенное время, вы можете использовать одну из дюжины различных структур кэширования, но идея здесь в том, что вы не восстанавливаете весь граф объектов, необходимый для вашего Ответ RSS с каждым запросом http. Если я правильно читаю ваш первоначальный вопрос, то я думаю, что это то, чего вы надеетесь достичь.

3 голосов
/ 12 октября 2008

Вы должны попробовать ROME framework. Отлично подходит для RSS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...