2008-10-12 35 views
2

我正在爲協作平臺的RSS提要實施。 說,有幾千個不同的協作室,在那裏用戶可以共享信息,每個需要發佈新聞,改變等一個RSS feed ...您將如何在Java Web環境中實現RSS訂閱源?

使用servlet的平原(即http://www.site.com/RSSServlet/?id=roomID)是昂貴的,每次一個RSS客戶端正在調用這個servlet(並且這種情況每隔10分鐘就會發生一次,每個用戶在上千個房間中的一個上註冊RSS提要),這將觸發整個servlet生命週期,這是非常昂貴的。

在另一方面,保持磁盤每個數以千計的房間的一個靜態XML文件是昂貴的,以及在硬盤空間以及IO操作方面...

還有一個限制 - 使用已經存在的框架可能不是一種選擇...

那麼,你將如何在Java環境中實現RSS提要?

+0

爲什麼你說每個RSS請求都會觸發整個servlet生命週期。通常,servlet將被初始化一次,然後將保持活動狀態,直到容器終止。然後,請求會觸發的唯一事情就是servlet處理請求的方法。 – Alexander 2008-10-13 10:58:51

回答

4

你說你servlet的一個新的http請求「會觸發整個servlet的生命週期」,就像Alexander已經指出的那樣,這不完全正確。它會簡單地觸發另一個方法調用您的doGet()doPost()方法。

我想你的意思是說,如果你有一個包含代碼來構建需要從頭RSS源的數據doGet/doPost方法,那麼每個請求觸發了一遍又一遍這個取數據的內容。

如果這是您關心的問題,並且您決定使用靜態內容,只需修改Servlet的方法來緩存您將返回的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響應所需的整個對象圖。如果我正在閱讀你原來的問題,那麼我認爲這是你希望完成的。

+0

馬特謝謝你的徹底解答。 考慮到RSS響應肯定會被緩存,問題是關於基於整個RSS機制在servlet上的性能。 在您看來,這個單一的servlet會支持我所談論的數字嗎? – 2008-10-15 14:24:30

3

您應該嘗試ROME框架。它非常適合RSS。

+0

像我加入到這個問題,外部框架是不可能的...你知道他們是如何實現這個? – 2008-10-12 15:40:36