3

コラボレーション プラットフォーム用の RSS フィードの実装に取り​​組んでいます。ユーザーが情報を共有できる数千の異なるコラボレーション ルームがあり、それぞれがニュースや変更などを含む RSS フィードを公開する必要があるとします。

単純なサーブレット (つまり、 http://www.site.com/RSSServlet/?id=roomID ) を使用すると、RSS クライアントがサーブレットを呼び出すたびにコストがかかります (これは、サーバーに登録されているユーザーごとに 10 分ごとに発生します)。数千のルームの 1 つで RSS フィードを受信する) これにより、サーブレットのライフサイクル全体がトリガーされ、コストがかかります。

一方、何千もの部屋のそれぞれについてディスク上に静的な XML ファイルを保持することは、ハード ディスク容量と IO 操作の点でコストがかかります...

もう1つの制限-既存のフレームワークを使用することはオプションではないかもしれません...

では、RSS フィードを Java 環境にどのように実装しますか?

4

2 に答える 2

5

あなたは、サーブレットへの新しい http リクエストが「サーブレットのライフサイクル全体をトリガーする」と言いますが、Alexander がすでに指摘しているように、これは正確には正しくありません。doGet()またはメソッドへの別のメソッド呼び出しをトリガーするだけdoPost()です。

あなたが言いたいのは、RSS フィードに必要なデータをゼロから作成するコードを含むdoGet/メソッドがある場合、各要求がこのデータのフェッチを何度もトリガーするということだと思います。doPost

これが懸念事項であり、静的コンテンツを除外する場合は、サーブレット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 );
}

アイテムを一定期間だけ「キャッシュ」に保存したい場合は、さまざまなキャッシング フレームワークの 1 つを使用できますが、ここでの考え方は、RSS 応答に必要なオブジェクト グラフ全体を再構築しないということです。各 http リクエスト。元の質問を正しく読んでいる場合、これがあなたが達成したいことだと思います。

于 2008-10-14T17:16:49.887 に答える
3

ROMEフレームワークを試す必要があります。RSSに最適です。

于 2008-10-12T14:44:18.073 に答える