@Override
    public synchronized void activate()
    {
        if (m_lActive)
        {
            // Already active
            return;
        }

        m_lActive = true;

        // Starts the session running in it's own thread to handle it's own commands
        Goliath.Threading.ThreadJob loThreadJob = new ThreadJob<SingleParameterArguments<ISession>>(new SingleParameterArguments(m_oSession))
        {
            @Override
            protected void onRun(SingleParameterArguments<ISession> toCommandArgs)
            {
                try
                {
                    // TODO: Optimise this method
                    ISession loSession = toCommandArgs.getParameter();
                    if (loSession == null)
                    {
                        loSession = Session.getCurrentSession();
                        m_oSession = loSession;
                    }
                    while (m_lActive && loSession != null && !loSession.isExpired())
                    {
                        if (!m_lPaused)
                        {
                            // Process the commands in the manager
                            process();
                        }
                        Goliath.Threading.Thread.sleep(getThreadDelay());
                    }
                }
                catch (Exception toException)
                {
                    // TODO: See what needs to be done here
                    Application.getInstance().log(toException);
                }
            }
        };

        for (int i =0; i< m_nMaxThreads; i++)
        {
            String lcSessionID = m_oSession == null ? "Unknown Session" : m_oSession.getSessionID();
            Goliath.Threading.Thread loThread = new Goliath.Threading.Thread(loThreadJob, lcSessionID);
            loThread.start();
        }
    }