従来のWebアプリケーションでは、Webコンテナで発生したイベントをクライアントへ通知するには、クライアントが
Webコンテナへ定期的にリクエストを行いイベント情報を取得する必要がありました。
しかし、Comet APIを使う事によりWebコンテナからのプッシュ機能が実現され、リアルタイムでクライアントへイベントを
通知する事ができます。
Comet APIを利用したWebアプリケーションの作成例を以下に示します。
※ビルドを行うには、<WebOTXインストールディレクトリ>/lib/wosv-rt.jar をCLASSPATHに設定する必要があります。
※Cometの利用に関しては、制限事項がありますので御確認ください。
Servletのinitメソッドで、CometEngineを取得しコンテキストパスを登録します。
コンテキストパスを登録する事により CometContextが生成されます。
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometContext;
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometEngine;
・・・
private String contextPath;
public void init(ServletConfig config) throws ServletException {
super.init(config);
contextPath = config.getServletContext().getContextPath() + "/comet";
CometEngine cometEngine = CometEngine.getEngine();
CometContext context = cometEngine.register(contextPath);
}
・・・
|
CometContextに CometHandlerを追加 |
doGetメソッドやdoPostメソッド等でCometContextを取得して、
イベントを受信するCometHandlerを追加します。
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometContext;
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometEngine;
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometHandler;
・・・
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
CometEngine cometEngine = CometEngine.getEngine();
CometContext cometContext = cometEngine.getCometContext(contextPath);
・・・
CometHandlerImpl handler = new CometHandlerImpl();
handler.attach(response.getWriter());
cometContext.addCometHandler(handler);
・・・
}
public class CometHandlerImpl implements CometHandler<PrintWriter>{
private PrintWriter printWriter;
public void attach(PrintWriter printWriter){
this.printWriter = printWriter;
}
・・・
}
・・・
|
CometContextのnotifyメソッドを実行する事で、あらかじめCometContextへ追加しておいたCometHandlerの
onEventメソッドへメッセージが通知されます。
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometContext;
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometEngine;
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometEvent;
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometHandler;
・・・
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
CometEngine cometEngine = CometEngine.getEngine();
CometContext cometContext = cometEngine.getCometContext(contextPath);
・・・
String message = request.getParameter("message");
cometContext.notify(message);
・・・
}
public class CometHandlerImpl implements CometHandler<PrintWriter>{
private PrintWriter printWriter;
public void attach(PrintWriter printWriter){
this.printWriter = printWriter;
}
public void onEvent(CometEvent event) throws IOException{
・・・
if ( event.getType() != CometEvent.READ ){
printWriter.println(event.attachment());
printWriter.flush();
}
・・・
}
・・・
}
・・・
|
CometHandlerはinterfaceであるため、onEvent以外にも実装しなければならない以下のメソッドがあります。
- onInitialize メソッド
CometHandlerが開始される際に呼び出されます。
- onInterrupt メソッド
コネクションが切断される際に呼び出されます。
- onTerminate メソッド
CometEngineからコンテキストパスが unregisterされる際に呼び出されます。
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometContext;
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometEngine;
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometEvent;
import com.nec.webotx.enterprise.web.connector.grizzly.comet.CometHandler;
public class CometHandlerImpl implements CometHandler<PrintWriter>{
private PrintWriter printWriter;
・・・
public void onInitialize(CometEvent event) throws IOException{
printWriter.println("<html><head><title>Comet</title></head><body bgcolor=\"#FFFFFF\">");
printWriter.flush();
}
public void onTerminate(CometEvent event) throws IOException{
onInterrupt(event);
}
public void onInterrupt(CometEvent event) throws IOException{
printWriter.println("closed");
printWriter.println("</body></html>");
printWriter.flush();
printWriter.close();
}
}
|
Comet API 仕様