Session 如何在Spring5WebSocket API中获取所有活动会话?

Session 如何在Spring5WebSocket API中获取所有活动会话?,session,websocket,Session,Websocket,我使用经典的Spring5WebSocket API编写WebSocket应用程序,即不使用SockJS和STOMP。 获取所有活动http会话时出现问题。 我可以获得一个当前会话,但如何获得所有活动会话? 如果我使用经典的JavaAPI(JSR356),我将使用一个方法:session.getOpenSessions()来获取所有打开的会话。 但我在Spring5WebSocket API中找不到类似的方法。 如何获取所有活动会话 //Configuration of WebSocket.

我使用经典的Spring5WebSocket API编写WebSocket应用程序,即不使用SockJS和STOMP。 获取所有活动http会话时出现问题。 我可以获得一个当前会话,但如何获得所有活动会话? 如果我使用经典的JavaAPI(JSR356),我将使用一个方法:session.getOpenSessions()来获取所有打开的会话。 但我在Spring5WebSocket API中找不到类似的方法。 如何获取所有活动会话

//Configuration of WebSocket.

@Configuration
@EnableWebSocket
public class WebSocketConfig implements 
WebSocketConfigurer {

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
  //Map endpoint URL to handler's method.
  //Add interceptor of HTTP-handshake to copy HTTP-session's attributes to WebSocket-session's attributes.
  registry.addHandler(getWsEndpoint(), "/endpoint").addInterceptors(new HttpSessionHandshakeInterceptor());
}

@Bean
public WebSocketHandler getWsEndpoint() {
    return new WsEndpoint();
}
}
我的WebSocket端点:

// WebSocket endpoint class. 

public class WsEndpoint extends TextWebSocketHandler {

 public WsEndpoint(){}

 public WebSocketMessage<String> wsMsg;                      

  // This method will be called after successful websocket connection.
  @Override
  public void afterConnectionEstablished(WebSocketSession session)                                     
   throws java.lang.Exception {

     wsMsg = new TextMessage(new String("Connection ok!"));        
   session.sendMessage(wsMsg);  
  }

    // This method is called if message was recieved. 
    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {       

     wsMsg = new TextMessage(new String("Message recieved!")); 
     session.sendMessage(wsMsg);
    }
}
//WebSocket端点类。
公共类WsEndpoint扩展了TextWebSocketHandler{
公共WsEndpoint(){}
公共WebSocketMessage wsMsg;
//成功连接websocket后将调用此方法。
@凌驾
建立连接后公共无效(WebSocketSession会话)
抛出java.lang.Exception{
wsMsg=newtextmessage(新字符串(“连接正常!”);
session.sendMessage(wsMsg);
}
//如果收到消息,则调用此方法。
@凌驾
public void handleTextMessage(WebSocketSession会话,TextMessage消息)引发IOException{
wsMsg=newtextmessage(新字符串(“messagereceived!”);
session.sendMessage(wsMsg);
}
}

SimpUserRegistry(
DefaultSimpUserRegistry
)跟踪已连接的websocket用户

方法
getUsers()
返回所有连接的用户及其会话

下面是一个示例代码:

@RestController
public class WebSocketController {

    private final SimpUserRegistry simpUserRegistry;

    public WebSocketController(SimpUserRegistry simpUserRegistry) {
        this.simpUserRegistry = simpUserRegistry;
    }

    @GetMapping("/ws/users")
    public List<String> connectedEquipments() {
        return this.simpUserRegistry
                .getUsers()
                .stream()
                .map(SimpUser::getName)
                .collect(Collectors.toList());
    }
}
@RestController
公共类WebSocketController{
私人最终SimpUserRegistry SimpUserRegistry;
公共WebSocketController(SimpUserRegistry SimpUserRegistry){
this.simpUserRegistry=simpUserRegistry;
}
@GetMapping(“/ws/users”)
公共列表连接的设备(){
返回这个。simpUserRegistry
.getUsers()
.stream()
.map(SimpUser::getName)
.collect(Collectors.toList());
}
}

如果不使用STOMP,这看起来不起作用吗?getUsers()在我的例子中是空的。这并不能回答最初的问题。您在这里添加了一个控制器类,这与@Mikhail要求的要求完全无关。我也有同样的问题。我的服务本来应该在所有连接的websocket会话之间进行通信,但SpringWebSocket库的工作方式是,它给我留下了孤立的单一websocket对象。(我正在考虑使用一些消息队列(比如JMS)来实现它)正如我所说的,这是一个示例代码。您也可以简单地将
SimpUserRegistry
注入服务。@FlorianOpes For me injecting
SimpUserRegistry
抛出错误。如果你能看看这个问题。