« WebSocketを使ってリモートデスクっぽいVNCっぽいWebSocketRemoteというものを作ってみました | メイン | JettyのWebSocketを使って大容量データを高速に送信するコツ »

Server.addHandlerの無くなったJetty7で複数のHandlerを追加する方法

WebSocketRemoteでは、HTTPによるアクセスとWebSocketによるアクセスをひとつのJettyのインスタンスで処理しています。
このような処理をweb.xmlを使わずコードだけで行なう場合、Jetty6では「Server.setHandler」と「Server.addHandler」を使い、複数のHandlerを追加する方法が一般的だったようです。ところがJetty7ではServer.addHandlerが使えなくなっており、WebSocketが使えるJetty7が必須のWebSocketRemote作成中に愕然としてしまいました。
Javaの世界はあまり詳しくないので間違いが含まれる可能性がありますが、日本語の情報が見当たらなかったので簡単にまとめてみます。コードは最後に載せているので、そちらをご覧下さい。

WebSocketRemoteでは、HTTPアクセスとWebSocketアクセスを以下のように処理しています。
・「http://[アドレス:port]/」にアクセスされた場合、jarファイル内のリソースのhtmlディレクトリにあるhtml等を使用する
・「ws://[アドレス:port]/ws/」にアクセスされた場合、「WebSocketServlet」を継承した「WSServlet」で処理を行なう

前者には、リソースに直接アクセスするための「ResourceHandler」を利用しました。リソース内のhtmlディレクトリのURLは「this.getClass().getClassLoader().getResource("html").toExternalForm()」のように取得しました。
後者には、「WebSocketServlet」を継承した「WSServlet」を「ServletHolder」でラップし、さらに「ServletContextHandler」で包み、WebSocketに対応したHandlerを作成しました。この際に「ws://[アドレス:port]/ws/」でアクセスされた時に使用されるように指定しています。
上記ふたつのHandlerを「HandlerList」に追加し、それをServerにセットします。
最後に、複数のプロトコルに対応したServerを起動しています。
src/main/java/com/kanasansoft/WebSocketRemote/WebSocketRemote.java(説明用に一部改変)
Server server = new Server(40320);

ResourceHandler resourceHandler = new ResourceHandler();
String htmlPath = this.getClass().getClassLoader().getResource("html").toExternalForm();
resourceHandler.setResourceBase(htmlPath);

WSServlet wsServlet = new WSServlet(this);
ServletHolder wsServletHolder = new ServletHolder(wsServlet);
ServletContextHandler wsServletContextHandler = new ServletContextHandler();
wsServletContextHandler.addServlet(wsServletHolder, "/ws/*");

HandlerList handlerList = new HandlerList();
handlerList.setHandlers(new Handler[] {resourceHandler, wsServletContextHandler});
server.setHandler(handlerList);
server.start();

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google

タグ クラウド