Browse Source
The resolver for /user/{username} prefixed destinations is now
more explicitly designed to store queue suffixes rather than session
id's, which is what we happen to use as queue suffixes.
This allows something other than the sessionId to be used without
having to change many places. It also enables applications to
construct destinations with user-specific queue suffixes without
making assumptions about what's used for queue suffixes. For
example a controller may construct a map with subscription destinations
and send that down to the client.
pull/297/merge
7 changed files with 166 additions and 138 deletions
@ -0,0 +1,75 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2013 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.messaging.simp.handler; |
||||||
|
|
||||||
|
import java.util.Collections; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Set; |
||||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||||
|
import java.util.concurrent.ConcurrentMap; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @author Rossen Stoyanchev |
||||||
|
* @since 4.0 |
||||||
|
*/ |
||||||
|
public class SimpleUserQueueSuffixResolver implements MutableUserQueueSuffixResolver { |
||||||
|
|
||||||
|
// userId -> [sessionId -> queueSuffix]
|
||||||
|
private final ConcurrentMap<String, Map<String, String>> cache = new ConcurrentHashMap<String, Map<String, String>>(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void addQueueSuffix(String user, String sessionId, String suffix) { |
||||||
|
Map<String, String> suffixes = this.cache.get(user); |
||||||
|
if (suffixes == null) { |
||||||
|
suffixes = new ConcurrentHashMap<String, String>(); |
||||||
|
Map<String, String> prevSuffixes = this.cache.putIfAbsent(user, suffixes); |
||||||
|
if (prevSuffixes != null) { |
||||||
|
suffixes = prevSuffixes; |
||||||
|
} |
||||||
|
} |
||||||
|
suffixes.put(sessionId, suffix); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void removeQueueSuffix(String user, String sessionId) { |
||||||
|
Map<String, String> suffixes = this.cache.get(user); |
||||||
|
if (suffixes != null) { |
||||||
|
if (suffixes.remove(sessionId) != null) { |
||||||
|
this.cache.remove(user, Collections.emptyMap()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Set<String> getUserQueueSuffixes(String user) { |
||||||
|
Map<String, String> suffixes = this.cache.get(user); |
||||||
|
return (suffixes != null) ? new HashSet<String>(suffixes.values()) : Collections.<String>emptySet(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getUserQueueSuffix(String user, String sessionId) { |
||||||
|
Map<String, String> suffixes = this.cache.get(user); |
||||||
|
if (suffixes != null) { |
||||||
|
return suffixes.get(sessionId); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -1,65 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright 2002-2013 the original author or authors. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package org.springframework.messaging.simp.handler; |
|
||||||
|
|
||||||
import java.util.Collections; |
|
||||||
import java.util.Set; |
|
||||||
import java.util.concurrent.ConcurrentHashMap; |
|
||||||
import java.util.concurrent.ConcurrentMap; |
|
||||||
import java.util.concurrent.CopyOnWriteArraySet; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @author Rossen Stoyanchev |
|
||||||
* @since 4.0 |
|
||||||
*/ |
|
||||||
public class SimpleUserSessionResolver implements MutableUserSessionResolver { |
|
||||||
|
|
||||||
// userId -> sessionId's
|
|
||||||
private final ConcurrentMap<String, Set<String>> userSessionIds = new ConcurrentHashMap<String, Set<String>>(); |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public void addUserSessionId(String user, String sessionId) { |
|
||||||
Set<String> sessionIds = this.userSessionIds.get(user); |
|
||||||
if (sessionIds == null) { |
|
||||||
sessionIds = new CopyOnWriteArraySet<String>(); |
|
||||||
Set<String> value = this.userSessionIds.putIfAbsent(user, sessionIds); |
|
||||||
if (value != null) { |
|
||||||
sessionIds = value; |
|
||||||
} |
|
||||||
} |
|
||||||
sessionIds.add(sessionId); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void removeUserSessionId(String user, String sessionId) { |
|
||||||
Set<String> sessionIds = this.userSessionIds.get(user); |
|
||||||
if (sessionIds != null) { |
|
||||||
if (sessionIds.remove(sessionId)) { |
|
||||||
this.userSessionIds.remove(user, Collections.<String>emptySet()); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Set<String> resolveUserSessionIds(String user) { |
|
||||||
Set<String> sessionIds = this.userSessionIds.get(user); |
|
||||||
return (sessionIds != null) ? sessionIds : Collections.<String>emptySet(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
Loading…
Reference in new issue