#websocket #glassfish-4 #java-ee-7
#websocket #glassfish-4 #java-ee-7
Вопрос:
Я использую JavaEE 7 и Glassfish 4 в качестве настройки моего проекта, и я хотел бы использовать websockets. В качестве браузера я использовал Chrome 35.0.1916.153. Моя конечная точка должна получить сообщение через websockets и передать это сообщение другим пользователям в той же группе.
Если я открою две вкладки браузера, которые открывают соединения websocket с разными группами [например, сначала 1, затем 2 (порядок имеет значение!)] все работает, как ожидалось. Но когда я вызываю широковещательный метод с помощью первой вкладки (groupId= 1), параметр groupId path имеет значение 2. Похоже, что это значение последнего вызова onOpen.
В этом вызове объект сеанса выглядит следующим образом:
session = (org.glassfish.tyrus.core.SessionImpl) SessionImpl{
uri=/test/group/1, <--
id='0fcff8ae-7ff8-42e8-a9e9-03cbb1f62562',
endpoint=EndpointWrapper{
endpointClass=null,
endpoint=org.glassfish.tyrus.core.AnnotatedEndpoint@59d91963,
uri='/test/group/2', <--
contextPath='/test'
}
}
URI из сеанса и конечной точки отличаются, что может привести к нежелательному поведению.
Кто-нибудь уже заметил это?
Мой класс конечной точки выглядит следующим образом:
@ServerEndpoint(value = "/group/{groupId}",
encoders = {MessageEncoder.class},
decoders = {MessageDecoder.class})
public class GroupEndpoint {
private Map<String, Set<Session>> groups = GroupSingleton.getGroups();
@OnMessage
public void broadcast(@PathParam("groupId") String groupId,
Message message,
Session session)
throws IOException, EncodeException {
for (Session session : groups.get(groupId))
session.getBasicRemote().sendObject(message);
}
@OnOpen
public void onOpen(@PathParam("groupId") String groupId,
Session session){
if(groups.containsKey(property)){
// then add peer to the list of viewers
groups.get(groupId).add(session);
}else{
// if not start a new list
Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
sessions.add(session);
groups.put(groupId, sessions);
}
}
@OnClose
public void onClose(@PathParam("groupId") String groupId, Session session) {
groups.get(groupId).remove(session);
if(groups.get(groupId).isEmpty())
groups.remove(groupId);
}
}
Ответ №1:
Это известная ошибка, отслеживаемая как TYRUS-203, которая была исправлена в Tyrus 1.1
Не могли бы вы использовать одну из продвигаемых сборок Glassfish?
Спасибо, Павел