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);
}
}