@Override public void storeMessage(String message) { session.addMessage(message); } }
@Override public ChannelHandlerContext getSendingContext() { return session.connectionContext(); }
@Override public State getState() { return session.getState(); }
@Override public void onConnect(final ChannelHandlerContext ctx, final SockJsSessionContext sockJsSessionContext) { session.setConnectionContext(ctx); session.onOpen(sockJsSessionContext); }
@Override public void run() { final long now = TimeUnit.NANOSECONDS.toMillis(System.nanoTime()); if (isInUse()) { return; } if (session.timestamp() + session.config().sessionTimeout() < now) { final SockJsSession removed = sessions.remove(session.sessionId()); session.connectionContext().close(); sessionTimer.cancel(true); heartbeatFuture.cancel(true); if (logger.isDebugEnabled()) { logger.debug("Removed {} from map[{}]", removed.sessionId(), sessions.size()); } } } }, session.config().sessionTimeout(), session.config().sessionTimeout(), TimeUnit.MILLISECONDS);
@Override public void onSockJSServerInitiatedClose() { if (logger.isDebugEnabled()) { logger.debug("Will close session connectionContext {}", session.connectionContext()); } session.connectionContext().close(); sessions.remove(session.sessionId()); }
@Override public boolean isInUse() { return getSockJsSession().connectionContext().channel().isActive() || getSockJsSession().inuse(); }
@Override public ChannelHandlerContext getSendingContext() { final ChannelHandlerContext openContext = getSockJsSession().openContext(); return openContext == null ? getSockJsSession().connectionContext() : openContext; }
private void flushMessages() { final Channel channel = getSockJsSession().connectionContext().channel(); if (channel.isActive() && channel.isRegistered()) { final List<String> allMessages = getSockJsSession().getAllMessages(); if (allMessages.isEmpty()) { return; } final MessageFrame messageFrame = new MessageFrame(allMessages); logger.debug("flushing [{}]", messageFrame); channel.writeAndFlush(messageFrame).addListener(new ChannelFutureListener() { @Override public void operationComplete(final ChannelFuture future) throws Exception { if (!future.isSuccess()) { final SockJsSession sockJsSession = getSockJsSession(); for (String msg : allMessages) { sockJsSession.addMessage(msg); } } } }); } }
@Override public void onMessage(String message) throws Exception { session.onMessage(message); }
private void startHeartbeatTimer(final ChannelHandlerContext ctx, final SockJsSession session) { heartbeatFuture = ctx.executor().scheduleAtFixedRate(new Runnable() { @Override public void run() { if (ctx.channel().isActive() && ctx.channel().isRegistered()) { if (logger.isDebugEnabled()) { logger.debug("Sending heartbeat for {}", session); } ctx.channel().writeAndFlush(new HeartbeatFrame()); } } }, session.config().heartbeatInterval(), session.config().heartbeatInterval(), TimeUnit.MILLISECONDS); }
private static SockJsSession getSession(final SockJsServiceFactory factory, final String sessionId) { SockJsSession session = sessions.get(sessionId); if (session == null) { final SockJsSession newSession = new SockJsSession(sessionId, factory.create()); session = sessions.putIfAbsent(sessionId, newSession); if (session == null) { session = newSession; } logger.debug("Created new session [{}]", sessionId); } else { logger.debug("Using existing session [{}]", sessionId); } return session; }
@Override public void onClose() { session.onClose(); }
private void flushMessages(final ChannelHandlerContext ctx) { final List<String> allMessages = getSockJsSession().getAllMessages(); if (allMessages.isEmpty()) { return; } final MessageFrame messageFrame = new MessageFrame(allMessages); ctx.channel().writeAndFlush(messageFrame).addListener(new ChannelFutureListener() { @Override public void operationComplete(final ChannelFuture future) throws Exception { if (!future.isSuccess()) { final SockJsSession sockJsSession = getSockJsSession(); for (String msg : allMessages) { sockJsSession.addMessage(msg); } } } }).addListener(ChannelFutureListener.CLOSE); }
@Override public void run() { final long now = TimeUnit.NANOSECONDS.toMillis(System.nanoTime()); if (isInUse()) { return; } if (session.timestamp() + session.config().sessionTimeout() < now) { final SockJsSession removed = sessions.remove(session.sessionId()); session.connectionContext().close(); sessionTimer.cancel(true); heartbeatFuture.cancel(true); if (logger.isDebugEnabled()) { logger.debug("Removed {} from map[{}]", removed.sessionId(), sessions.size()); } } } }, session.config().sessionTimeout(), session.config().sessionTimeout(), TimeUnit.MILLISECONDS);
@Override public void onConnect(final ChannelHandlerContext ctx, final SockJsSessionContext sockJsSessionContext) { session.setConnectionContext(ctx); session.onOpen(sockJsSessionContext); }
@Override public void onSockJSServerInitiatedClose() { if (logger.isDebugEnabled()) { logger.debug("Will close session connectionContext {}", session.connectionContext()); } session.connectionContext().close(); sessions.remove(session.sessionId()); }
@Override public boolean isInUse() { return getSockJsSession().connectionContext().channel().isActive() || getSockJsSession().inuse(); }