transportsessionmanager.java

来自「基于Jabber协议的即时消息服务器」· Java 代码 · 共 214 行

JAVA
214
字号
/** * $Revision$ * $Date$ * * Copyright (C) 2006 Jive Software. All rights reserved. * * This software is published under the terms of the GNU Public License (GPL), * a copy of which is included in this distribution. */package org.jivesoftware.wildfire.gateway;import java.util.*;import org.jivesoftware.util.NotFoundException;import org.jivesoftware.wildfire.SessionManager;import org.jivesoftware.wildfire.XMPPServer;import org.jivesoftware.wildfire.user.UserNotFoundException;import org.xmpp.packet.JID;/** * Manages sessions with legacy transports implementations. * * Keeps track of all of the active sessions with the various transports. * Only one expected to be associated with a single transport instance. * * @author Daniel Henninger */public class TransportSessionManager {    /**     * Container for all active sessions.     */    private Map<JID,TransportSession> activeSessions = new HashMap<JID,TransportSession>();    /**     * Timer to check for orphaned sessions.     */    private Timer timer = new Timer();    /**     * Interval at which sessions are reaped.     */    private int reaperInterval = 300000; // 5 minutes    /**     * The actual repear task.     */    private SessionReaper sessionReaper;    /**     * The transport we are associated with.     */    BaseTransport transport;    /**     * Group of all threads related to this session.     */    public ThreadGroup threadGroup;    /**     * Creates the transport session manager instance and initializes.     *     * @param transport Transport associated with this session manager.     */    TransportSessionManager(BaseTransport transport) {        this.transport = transport;        sessionReaper = new SessionReaper();        timer.schedule(sessionReaper, reaperInterval, reaperInterval);    }    /**     * Shuts down the session manager.     */    public void shutdown() {        sessionReaper.cancel();        timer.cancel();    }    /**     * Initialize the thread group manager.     *     * @param jid JID for naming purposes of the thread group manager.     */    public void startThreadManager(JID jid) {        threadGroup = new ThreadGroup(jid.toString());    }    /**     * Destroys the thread group manager.     */    public void stopThreadManager() {        threadGroup.destroy();    }    /**     * Starts a thread associated with a session.     *     * @param session Session the thread will be associated with.     * @return A thread wrapped around the session.     */    public Thread startThread(TransportSession session) {        Thread sessionThread = new Thread(threadGroup, session);        sessionThread.start();        return sessionThread;    }    /**     * Retrieve the session instance for a given JID.     *     * Ignores the resource part of the jid.     *     * @param jid JID of the instance to be retrieved.     * @throws NotFoundException if the given jid is not found.     * @return TransportSession instance requested.     */    public TransportSession getSession(JID jid) throws NotFoundException {        TransportSession session = activeSessions.get(new JID(jid.toBareJID()));        if (session == null) {            throw new NotFoundException("Could not find session requested.");        }        return session;    }    /**     * retrieves the session instance for a given user.     *     * @param username Username of the instance to be retrieved.     * @throws NotFoundException if the given username is not found.     * @return TransportSession instance requested.     */    public TransportSession getSession(String username) throws NotFoundException {        TransportSession session = activeSessions.get(XMPPServer.getInstance().createJID(username, null));        if (session == null) {            throw new NotFoundException("Could not find session requested.");        }        return session;    }    /**     * Stores a new session instance with the legacy service.     *     * Expects to be given a JID and a pre-created session.  Ignores the     * resource part of the JID.     *     * @param jid JID information used to track the session.     * @param session TransportSession associated with the jid.     */    public void storeSession(JID jid, TransportSession session) {        activeSessions.put(new JID(jid.toBareJID()), session);    }    /**     * Removes a session instance with the legacy service.     *     * Expects to be given a JID which indicates which session we are     * removing.     *      * @param jid JID to be removed.     */    public void removeSession(JID jid) {        activeSessions.remove(new JID(jid.toBareJID()));        try {            getTransport().notifyRosterOffline(jid);        }        catch (UserNotFoundException e) {            // Don't care        }    }    /**     * Retrieves a collection of all active sessions.     *     * @return List of active sessions.     */    public Collection<TransportSession> getSessions() {        return activeSessions.values();    }    /**     * Bury any transport sessions that no longer have an associated xmpp session.     */    private class SessionReaper extends TimerTask {        /**         * Kill any session that has been orphaned.         */        public void run() {            cleanupOrphanedSessions();        }    }    /**     * Compares active xmpp sessions with active transport sessions and buries the orphaned.     */    private void cleanupOrphanedSessions() {        SessionManager sessionManager = SessionManager.getInstance();        for (TransportSession session : getSessions()) {            if (sessionManager.getSessionCount(session.getJID().getNode()) == 0) {                transport.registrationLoggedOut(session);            }        }    }    /**     * Retrieves the transport this session manager is associated with.     *     * @return transport associated with this session manager.     */    public BaseTransport getTransport() {        return this.transport;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?