Comet(Webアプリケーション)

従来の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);    
}

・・・

 
CometContextCometHandlerを追加

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

    ・・・

}

・・・

 
メッセージをCometHandlerへ通知

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のその他の実装

CometHandlerはinterfaceであるため、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 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();
        }
}

 
APIリファレンス
Comet API 仕様