@SuppressWarnings({ "unchecked", "rawtypes" }) public void operationComplete(CloseFuture future) { // now connection should be closed log.debug("Close operation completed {}: {}", sessionId, future.isClosed()); future.removeListener(this); for (Object key : session.getAttributeKeys()) { Object obj = session.getAttribute(key); log.debug("{}: {}", key, obj); if (obj != null) { if (log.isTraceEnabled()) { log.trace("Attribute: {}", obj.getClass().getName()); } if (obj instanceof IoProcessor) { log.debug("Flushing session in processor"); ((IoProcessor) obj).flush(session); log.debug("Removing session from processor"); ((IoProcessor) obj).remove(session); } else if (obj instanceof IoBuffer) { log.debug("Clearing session buffer"); ((IoBuffer) obj).clear(); ((IoBuffer) obj).free(); } } } } };
/** {@inheritDoc} */ @Override public void sessionClosed(IoSession session) throws Exception { String sessionId = (String) session.getAttribute(RTMPConnection.RTMP_SESSION_ID); log.debug("Session closed: {} id: {}", session.getId(), sessionId); if (log.isTraceEnabled()) { log.trace("Session attributes: {}", session.getAttributeKeys()); } if (sessionId != null) { RTMPMinaConnection conn = (RTMPMinaConnection) RTMPConnManager.getInstance().getConnectionBySessionId(sessionId); if (conn != null) { // fire-off closed event handler.connectionClosed(conn); // clear any session attributes we may have previously set // TODO: verify this cleanup code is necessary. The session is over and will be garbage collected surely? if (session.containsAttribute(RTMPConnection.RTMP_HANDSHAKE)) { session.removeAttribute(RTMPConnection.RTMP_HANDSHAKE); } if (session.containsAttribute(RTMPConnection.RTMPE_CIPHER_IN)) { session.removeAttribute(RTMPConnection.RTMPE_CIPHER_IN); session.removeAttribute(RTMPConnection.RTMPE_CIPHER_OUT); } } else { log.warn("Connection was not found for {}", sessionId); } cleanSession(session, false); } else { log.debug("Connections session id was null in session, may already be closed"); } }
/** * @see IoSession#getAttributeKeys() */ public Set<Object> getAttributeKeys() { return wrappedSession.getAttributeKeys(); }
@Override protected Object getProperty0(OgnlContext context, Object target, String name) throws OgnlException { if (target instanceof IoSession && "attributes".equals(name)) { Map<String, Object> attributes = new TreeMap<>(); IoSession s = (IoSession) target; for (Object key: s.getAttributeKeys()) { Object value = s.getAttribute(key); if (value == null) { continue; } attributes.put(String.valueOf(key), value); } return attributes; } return OgnlRuntime.NotFound; }
@Override protected Object getAttribute0(String fqan) throws Exception { if (fqan.equals("attributes")) { Map<String, String> answer = new LinkedHashMap<String, String>(); for (Object key : getSource().getAttributeKeys()) { answer.put(String.valueOf(key), String.valueOf(getSource().getAttribute(key))); } return answer; } return super.getAttribute0(fqan); }
@Override protected Object getAttribute0(String fqan) throws Exception { if (fqan.equals("attributes")) { Map<String, String> answer = new LinkedHashMap<>(); for (Object key: getSource().getAttributeKeys()) { answer.put(String.valueOf(key), String.valueOf(getSource().getAttribute(key))); } return answer; } return super.getAttribute0(fqan); }