nimbus (1.2.4) | 2018-01-25 20:02 |
nimbus-sample (1.2.4) | 2018-01-26 17:06 |
ウェブアプリケーション開発において、双方向通信を行う場合、通信規格であるwebsocketを使用します。
NimbusではJavaEEサーバ上で動作するwebsocketアプリケーション開発を支援する機能を提供します。 JSR356
サーバサイドのwebsocketアプリケーションを作成するためのServerEndpointのデフォルト実装がDefaultEndpointServiceです。
ServerEndpointを生成するためのConfiguratorのデフォルト実装がDefaultConfiguratorServiceです。
websocketアプリケーションを作成するには、AbstractMessageHandlerFactoryService、AbstractMessageHandlerServiceを継承したクラスを作成する必要があります。
また、websocketの事前認証用ServletがWebSocketAuthServletです。
関連するパッケージは、以下です。
javax.websocket.Endpointを継承したサービスクラスです。
メッセージハンドラ(MessageHandler、SessionMessageHandler)を複数登録することができます。
セッション開始時に認証を行うためのAuthenticatorを登録することができます。
また、セッション開始時、セッション終了時、エラー発生時にメッセージハンドラの該当処理を呼び出します。
javax.websocket.server.ServerEndpointConfig.Configuratorを継承したサービスクラスです。
ServerEndpointのインスタンスを生成するためのConfiguratorです。
生成するEndpointを登録することができます。
DefaultEndpointServiceに登録するメッセージハンドラとそのメッセージハンドラを生成するためのFactoryサービスです。
それぞれの抽象クラスを継承し、websocketアプリケーションを生成します。
AbstractMessageHandlerFactoryService と AbstractMessageHandlerService の簡単な実装例を示します。
- import java.io.IOException;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.Set;
- import javax.websocket.CloseReason;
- import javax.websocket.EndpointConfig;
- import javax.websocket.Session;
- import jp.ossc.nimbus.core.Service;
- public class SampleMessageHandlerFactoryService extends AbstractMessageHandlerFactoryService
- implements SampleMessageHandlerFactoryServiceMBean {
- protected Set sessionSet;
- public void createService() throws Exception {
- sessionSet = new HashSet();
- }
- protected Service createServiceInstance() throws Exception {
- return new SampleMessageHandlerService();
- }
- public void sendMessage(String message) {
- Iterator itr = sessionSet.iterator();
- while(itr.hasNext()) {
- Session session = (Session)itr.next();
- if(session.isOpen()) {
- try {
- session.getBasicRemote().sendText(message);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- public class SampleMessageHandlerService extends AbstractMessageHandlerService {
- @Override
- protected void onOpenProcess(Session session, EndpointConfig config) {
- if(!sessionSet.contains(session)) {
- sessionSet.add(session);
- }
- SessionProperties prop = SessionProperties.getSessionProperty(session);
- String message = "open session id=" + prop.getId() + " sessionId=" + session.getId();
- // メンバーが増えたことを全員に通知
- sendMessage(message);
- }
- @Override
- protected void onCloseProcess(Session session, CloseReason closeReason) {
- if(sessionSet.contains(session)) {
- sessionSet.remove(session);
- }
- SessionProperties prop = SessionProperties.getSessionProperty(session);
- String message = "close session id=" + prop.getId() + " sessionId=" + session.getId();
- // メンバーが減ったことを全員に通知
- sendMessage(message);
- }
- @Override
- protected void onErrorProcess(Session session, Throwable thr) {
- thr.printStackTrace();
- }
- @Override
- protected void onMessageProcess(String message) {
- SessionProperties prop = SessionProperties.getSessionProperty(session);
- message = "message recieve from session id=" + prop.getId() + " sessionId=" + session.getId() + " message is \"" + message + "\"";
- // 受信したメッセージを全員に通知
- sendMessage(message);
- }
- }
- }
通常のWebsocketアプリケーションはEndpointのセッション開始(OnOpen)時に認証処理を行うことが多いと思われるが、Nimbusでは事前にServletで認証を行える仕組みを提供している。
WebSocketAuthServlet には認証を行うためのAuthenticatorを設定することができる。
Authenticatorは、認証チケットを生成し、WebSocketAuthServletはその認証チケットをクライアントに返却する。
クライアントはWebsocketのセッション開始時のリクエストパラメータに認証チケットを含める。
ServerEndpointでは、セッション開始時にパラメータの認証チケットのチェックを行う。
サンプルは、以下。