サーバー側で JMS を使用して通知システムを作成するために Comet を試してみます。
Web サービスが、CometHandler に通知するサーブレットに非同期メッセージを送信する必要があります。
Glassfish のカウンターサンプル (http://docs.oracle.com/cd/E18930_01/html/821-2418/ggrgt.html#ggrgr) を使い始めたのですが、大量のハンドラを作成しているようです。
問題は(私が思うに)、各リクエストでコメットハンドラーが作成されることです
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
CounterHandler handler = new CounterHandler();
handler.attach(res); //here the response of this request is attached to handler
CometEngine engine = CometEngine.getEngine();
CometContext context = engine.getCometContext(contextPath);
context.addCometHandler(handler);
}
次に、CometHandler onEvent で、ハンドラーは応答をクライアントに送信し、再開します
public void onEvent(CometEvent event) throws IOException {
if (CometEvent.NOTIFY == event.getType()) {
response.getWriter().write("something") //response is the attached one
// commented out the resume if it is Http Streaming
event.getCometContext().resumeCometHandler(this);
}
}
HTML ページでは、JQuery を使用して longPoll を次のように実行します。
function poll() {
var url = pollUrl;
$.getJSON(
url,
function(data) {
updateAnswer(data);//do things with data
poll();
}
);
}
そのため、getJSON ごとに新しい CometHandler が作成され、前のものは「忘れられます」。
問題は、これを行うためのより良い方法はありますか?
そして、次に使用するハンドラーが別のものである場合、ハンドラーを再開する必要があるのはなぜですか?
ご協力ありがとう御座います!
-- 編集 --
cometHandler を HttpSession 属性に入れようとしましたが、javadoc が言うように addCometHandler(handler) を使用する必要があるため、問題はまだ残っています:
Add a CometHandler which will starts the process of suspending the underlying response.
The underlying HttpServletResponse will not get committed until
CometContext.resumeCometHandler(CometHandler) is invoked, unless the
CometContext.setExpirationDelay(long) expires.
そして、resumeCometHandler(this) を使用して別のことがわかります
Resume the Comet request and remove it from the active CometHandler list. Once resumed,
a CometHandler must never manipulate the HttpServletRequest or HttpServletResponse as
those object will be recycled and may be re-used to serve another request. If you cache
them for later reuse by another thread there is a possibility to introduce corrupted
responses next time a request is made.
したがって、リクエストごとに新しい CometHandler を作成しない方法があるかどうかはわかりません。カウンターを置いて onInitialize ハンドラー メソッドでインクリメントし、onTerminate ハンドラー メソッドでデクリメントすると、リクエストごとに増加します。