public void start()
	{
	    if(connectionEventListener == null)
	    {
	        throw new RuntimeException("Fatal : no ClientEventListener instance was set");
	    }

	    assignDefaultProtocol();
	    
	    // Create connection event queue
	    connectionEventQueue = JPushComponentFactory.getPhysicalConnectionEventQueue(
	    		connectionEventQueueOption);
	    
	    if (!connectionEventQueue.create())
	    {
	        throw new RuntimeException("Fatal : failed to create Event Queue");
	    }
	    
	    if (!demultiplexor.start())
	    {
	    	connectionEventQueue.destroy();
	        throw new RuntimeException("Fatal : failed to start Demultiplexor");
	    }

	    if (!startListeners())
	    {
	        stopListeners();
	        demultiplexor.stop();
	        connectionEventQueue.destroy();
	    }

	    if (isMonitorEnabled && !monitorAcceptor.startListening())
	    {
	        stopListeners();
	        throw new RuntimeException("Internal problem : unable to start monitoring acceptor");
	    }

	    broadcastStreamerManager.start();

	    startMonitorService();

	}