public void removeSubscriber()

in core/src/main/java/flex/messaging/services/messaging/SubscriptionManager.java [619:690]


    public void removeSubscriber(Object clientId, String selector, String subtopicString, String endpointId) {
        MessageClient client = null;
        try {
            synchronized (allSubscriptionsLock) {
                // Do a simple lookup first to avoid the creation of a new MessageClient instance
                // in the following call to getMessageClient() if the subscription is already removed.
                client = allSubscriptions.get(clientId);
                if (client == null) // Subscription was already removed.
                    return;

                // Re-get in order to track refs correctly.
                client = getMessageClient(clientId, endpointId);
            }

            Subtopic subtopic = getSubtopic(subtopicString);
            TopicSubscription topicSub;
            Map<Object, MessageClient> subs;
            Map<Subtopic, TopicSubscription> map = null;

            if (subtopic == null) {
                topicSub = globalSubscribers;
            } else {
                if (subtopic.containsSubtopicWildcard())
                    map = subscribersPerSubtopicWildcard;
                else
                    map = subscribersPerSubtopic;

                topicSub = map.get(subtopic);

                if (topicSub == null)
                    throw new MessageException("Client: " + clientId + " not subscribed to subtopic: " + subtopic);
            }

            if (selector == null)
                subs = topicSub.defaultSubscriptions;
            else
                subs = topicSub.selectorSubscriptions.get(selector);

            if (subs == null || subs.get(clientId) == null)
                throw new MessageException("Client: " + clientId + " not subscribed to destination with selector: " + selector);

            synchronized (this) {
                subs.remove(clientId);
                if (subs.isEmpty() &&
                        destination.isClustered() && destination.getServerSettings().getRoutingMode() == RoutingMode.SERVER_TO_SERVER)
                    sendSubscriptionToPeer(false, selector, subtopicString);

                if (subs.isEmpty()) {
                    if (selector != null) {
                        if (topicSub.selectorSubscriptions != null && !topicSub.selectorSubscriptions.isEmpty())
                            topicSub.selectorSubscriptions.remove(selector);
                    }

                    if (subtopic != null &&
                            (topicSub.selectorSubscriptions == null || topicSub.selectorSubscriptions.isEmpty()) &&
                            (topicSub.defaultSubscriptions == null || topicSub.defaultSubscriptions.isEmpty())) {
                        if ((topicSub.selectorSubscriptions == null || topicSub.selectorSubscriptions.isEmpty()) &&
                                (topicSub.defaultSubscriptions == null || topicSub.defaultSubscriptions.isEmpty()))
                            map.remove(subtopic);
                    }
                }
            }

            if (client.removeSubscription(selector, subtopicString)) {
                allSubscriptions.remove(clientId);
                client.invalidate(); // Destroy the MessageClient.
            }
        } finally {
            if (client != null)
                releaseMessageClient(client);
        }
    }