@Override
    public void occupantLeft(JID roomJID, JID userJID, String nickname)
    {
        if (!isForThisService(roomJID)) {
            return;
        }

        Log.debug("Removed local occupancy in room '{}' of service '{}': entity '{}' using nickname '{}'", roomJID.getNode(), serviceName, userJID, nickname);
        final OccupantRemovedTask task = new OccupantRemovedTask(serviceName, roomJID.getNode(), nickname, userJID, XMPPServer.getInstance().getNodeID());
        process(task); // On this cluster node.

        // On all other cluster nodes
        if (PROPERTY_USE_NONBLOCKING_CLUSTERTASKS.getValue()) {
            CacheFactory.doClusterTask(task);
        } else {
            CacheFactory.doSynchronousClusterTask(task, false);
        }
    }
When an XMPP entity / user is removed as an occupant of a room, this event handler will ensure that this
instance of OccupantManager, as well as all instances for the same server on every other cluster node, updates
the relevant data that it maintains to perform post-cluster event maintenance.

@param roomJID the JID of the room where the occupant has left.
@param userJID The 'real' JID (not room-at-service-slash-nickname) of the XMPP user that left.
@param nickname nickname that the user used in the room.
xmppserver/src/main/java/org/jivesoftware/openfire/muc/spi/OccupantManager.java