2014-11-04 1 views
0

Я использую ROME для создания фида из данных в моей базе данных.Размер RSS-канала

Во всех найденных образцах сервлет извлекает все данные из базы данных и отправляет их в виде фида.

Теперь, если база данных содержит тысячи записей, сколько записей я должен отправлять?

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    try { 
     SyndFeed feed = getFeed(request); 

     String feedType = request.getParameter("type"); 
     feedType = feedType != null ? feedType : defaultType; 
     feed.setFeedType(feedType); 

     response.setContentType("application/xml; charset=UTF-8"); 
     SyndFeedOutput output = new SyndFeedOutput(); 
     output.output(feed, response.getWriter()); 
    } catch (FeedException ex) { 
     String msg = "Could not generate feed"; 
     log(msg, ex); 
     response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, msg); 
    } 
} 


protected SyndFeed getFeed(HttpServletRequest request) { 

    // **** Here I query the database for posts, but I don't know how many 
    // I should fetch or where should I stop? *** 
    List<Post> posts = getPosts(); 

    SyndFeed feed = new SyndFeedImpl(); 
    feed.setTitle("My feed"); 
    feed.setLink("http://myurl"); 
    feed.setDescription("my desc"); 

    // create the feeds.Each tutorial will be a feed entry 
    List<SyndEntry> entries = new ArrayList<SyndEntry>(); 
    for (Post post : posts) { 
     SyndEntry entry = new SyndEntryImpl(); 
     SyndContent description; 
     String title = post.getTitle(); 
     String link = post.getLink(); 
     entry.setTitle(title); 
     entry.setLink(link); 

     // Create the description of the feed entry 
     description = new SyndContentImpl(); 
     description.setType("text/plain"); 
     description.setValue(post.getDesc()); 
     entry.setDescription(description); 
     entries.add(entry); 
    } 
    feed.setEntries(entries); 
    return feed; 
} 

ответ

0

Предлагаю пейджинговую систему. пользователь делает запрос для страницы 0, чтобы принять 30 элементов. то пользователь делает запрос на страницу 1, чтобы принять следующие 30 пунктов. первый запрос: пункты 0-> 29, второй запрос: пункты 30-> 59. чтобы эта модель имеет целочисленную переменную с именем skip отслеживать то, что положение, чтобы начать на, например:

int skip = page * numItems; // first request: 0 * 30 (starts at 0), sec request: 1 * 30 (starts at 30) 

Таким образом, вы будете пропускать очень много пунктов и принимать только значение количество_элементов. Затем клиент запрашивает как можно больше элементов питания, которые клиент хочет сразу.

+0

спасибо за ответ, но RSS-канал не работает именно так. Я не знаю, кто звонит на мой сервлет, поэтому я должен всегда отправлять последние сообщения в порядке убывания. –

1

На самом деле нет единственного способа сделать это, чтобы все rss-клиенты поддерживали, но я бы рекомендовал проверить приложение rfc 5005 в приложении B, у вас будет, по крайней мере, референс, чтобы дать клиентам. https://tools.ietf.org/html/rfc5005#appendix-B

, так как ваш запрос по умолчанию всегда показывает самую последнюю (определяемую вами длину страницы), отсортированную по убыванию, все клиенты будут отображаться правильно. Клиенты, которым требуется страница, могут реализовать этот стандарт.

+0

Итак, я просто представляю последние N сообщений, и это зависит от клиента, чтобы настроить частоту выборки? –

+0

Да, честно говоря, это характер ATOM/RSS (особенно RSS). Этот RFC помогает, но на самом деле нет файла дескриптора (например, WSDL или WADL) или иным образом, чтобы помочь им узнать, поддерживаете ли вы стандартные (RFC) или нестандартные параметры запроса. Самое близкое, что вы можете сделать, это добавить файл дескриптора OpenSearch, чтобы помочь. –