2008-10-12 4 views
2

Je travaille sur une implémentation de flux RSS pour une plateforme de collaboration. Supposons qu'il existe plusieurs milliers de salles de collaboration différentes où les utilisateurs peuvent partager des informations, et chacun doit publier un flux RSS avec des actualités, des modifications, etc.Comment implémenteriez-vous un flux RSS dans un environnement Web Java?

L'utilisation d'une servlet simple (par exemple, http://www.site.com/RSSServlet/?id=roomID) est coûteuse à chaque fois un client RSS appelle le servlet (et cela se produira dire toutes les 10 minutes pour chaque utilisateur enregistré à un flux RSS sur l'un des milliers de pièces) cela déclenchera l'ensemble du cycle de vie du servlet, ce qui est coûteux.

D'autre part, la tenue d'un fichier XML statique sur le disque pour chacun des milliers de chambres est coûteuse et, en termes d'espace disque dur, ainsi que les opérations IO ...

Encore une limitation - à l'aide des cadres déjà existants pourrait ne pas être une option ...

Alors, comment voulez-vous mettre en œuvre des flux RSS dans un envoronment Java?

+0

Pourquoi dites-vous que chaque demande de RSS déclenchera l'ensemble du cycle de vie du servlet. Habituellement, le servlet sera initialisé une fois, et sera laissé en vie jusqu'à ce que le conteneur se termine. La seule chose qu'une requête déclencherait alors est une méthode de la servlet pour traiter la requête. – Alexander

Répondre

4

Vous dites qu'une nouvelle requête http à votre servlet « déclenchera l'ensemble du cycle de vie du servlet », qui, comme Alexander a déjà souligné, est pas tout à fait vrai. Il déclenchera simplement un autre appel de méthode à vos méthodes doGet() ou doPost(). Je pense que ce que vous voulez dire c'est que si vous avez une méthode doGet/doPost qui contient du code pour construire les données nécessaires pour le flux RSS, alors chaque requête déclenche cette extraction de données encore et encore. Si cela vous préoccupe et que vous décidez du contenu statique, il vous suffit de modifier votre méthode Servlet doGet/doPost pour mettre en cache le contenu RSS que vous auriez autrement renvoyé, de sorte que la gestion de chaque requête ne signifie pas la réexécution de tous les éléments. les données encore une fois.

Par exemple

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(...)); 
} 

devient

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); 
} 

Si vous voulez seulement stocker des éléments dans un « cache » pour un certain laps de temps, vous pouvez utiliser l'un d'une douzaine de cadres de mise en cache, mais l'idée ici est que vous ne reconstruisez pas le graphe d'objet entier nécessaire pour votre réponse RSS avec chaque requête http. Si je lis bien votre question originale, je pense que c'est ce que vous espérez accomplir.

+0

Matt merci pour votre réponse approfondie. Prenant en considération le fait que les réponses RSS seront certainement mises en cache, la question concerne la performance de baser l'ensemble du mécanisme de RSS sur un servlet. À votre avis, est-ce que cette simple servlet va prendre en charge les numéros dont j'ai parlé? –

+0

@Yuval: pourquoi pensez-vous qu'appeler une méthode de servlet est nécessairement plus lent que de retourner un fichier à partir du disque?En fait, Tomcat et d'autres utilisent également une servlet (DefaultServlet) pour servir les fichiers statiques. J'ai écrit une telle servlet ici: http://stackoverflow.com/questions/132052/ –

3

Vous devriez essayer le cadre ROME. C'est excellent pour RSS.

+0

Comme je l'ai ajouté à la question, les cadres externes sont hors de question ... savez-vous comment ils mettent en œuvre cela? –