提交来自之前websocket调用的PathParam

时间:2014-06-18 16:04:44

标签: websocket glassfish-4 java-ee-7

我使用JavaEE 7和Glassfish 4作为我的项目设置,我想使用websockets。作为浏览器我使用的是Chrome 35.0.1916.153。我的端点应该通过websockets接收消息,并将此消息广播给同一组内的其他用户。

如果我打开两个浏览器标签,打开不同组的websocket连接[例如第一个,然后是2个(订单很重要!)]一切都按预期工作。但是当我通过第一个选项卡(groupId = 1)调用广播方法时,groupId路径参数的值为2.看起来它是最后一次onOpen调用的值。

在此调用中,Session对象如下所示:

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 个答案:

答案 0 :(得分:0)

这是一个已知错误,跟踪为TYRUS-203,已在Tyrus 1.1中修复

你可以使用promoted Glassfish版本吗?

谢谢, 帕维尔