Java 通过Websocket在Spring框架中实时检测离线和在线客户端
我正在构建一个类似slack的应用程序。我有很多客户端在web和移动设备上运行。它们通过Java 通过Websocket在Spring框架中实时检测离线和在线客户端,java,spring,spring-boot,websocket,spring-websocket,Java,Spring,Spring Boot,Websocket,Spring Websocket,我正在构建一个类似slack的应用程序。我有很多客户端在web和移动设备上运行。它们通过Stomp连接到websocket。我想实时检测哪个用户在线和离线。websocket服务器在spring framework上运行。 spring接受如下请求。我将心跳传入的和传出的值设置为20000 ms @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements Web
Stomp
连接到websocket。我想实时检测哪个用户在线和离线。websocket
服务器在spring framework
上运行。
spring接受如下请求。我将心跳传入的和传出的值设置为20000 ms
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
private List<StompPrincipal> onlineUsers = new ArrayList<>();
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("*")
.setHandshakeHandler(new CustomHandshakeHandler())
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.setApplicationDestinationPrefixes("/ws");
config.enableSimpleBroker("/ws")
.setTaskScheduler(new DefaultManagedTaskScheduler())
.setHeartbeatValue(new long[]{20000,20000});
}
}
正如上面的代码,我可以看到用户在请求websocket服务器之后添加了onlineUser
。
但问题是,我无法确定用户在线后是否离线。请您建议我确定这一点。
通过这种方式确定在线和离线用户也是最佳实践吗?如果没有,请等待您的建议。现在非常感谢。经过更多的搜索,我找到了所描述的解决方案。我实现了ApplicationListener
并覆盖了下面的方法
@Override
public void onApplicationEvent(SessionDisconnectEvent event) {
}
通过这种方式,我可以捕获从websocket连接断开连接的用户。
我仍在等待您的最佳实践建议。使用会话Id检测用户
SocketJS
this.client = over(new SockJS(environment.SOCKET+'/end'));
this.client.connect({userId:'UserIdHere'}, () => {
});
弹簧靴
@Component
public class WebSocketEventListener {
private static final Logger logger = LoggerFactory.getLogger(WebSocketEventListener.class);
@Autowired
private SimpMessageSendingOperations messagingTemplate;
@EventListener
public void handleWebSocketConnectListener(SessionConnectedEvent event) {
StompHeaderAccessor stompAccessor = StompHeaderAccessor.wrap(event.getMessage());
@SuppressWarnings("rawtypes")
GenericMessage connectHeader = (GenericMessage) stompAccessor
.getHeader(SimpMessageHeaderAccessor.CONNECT_MESSAGE_HEADER); // FIXME find a way to pass the username
// to the server
@SuppressWarnings("unchecked")
Map<String, List<String>> nativeHeaders = (Map<String, List<String>>) connectHeader.getHeaders()
.get(SimpMessageHeaderAccessor.NATIVE_HEADERS);
String login = nativeHeaders.get("userId").get(0);
String sessionId = stompAccessor.getSessionId();
logger.info("Chat connection by user <{}> with sessionId <{}>", login, sessionId);
}
@EventListener
public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
StompHeaderAccessor stompAccessor = StompHeaderAccessor.wrap(event.getMessage());
String sessionId = stompAccessor.getSessionId();
logger.info("Chat connection by user <{}> with sessionId <{}>", "Nop", sessionId);
}
@组件
公共类WebSocketEventListener{
私有静态最终记录器Logger=LoggerFactory.getLogger(WebSocketEventListener.class);
@自动连线
私有SimpMessageSendingOperations消息模板;
@事件监听器
public void handleWebSocketConnectListener(会话连接事件){
StompHeaderAccessor stompAccessor=StompHeaderAccessor.wrap(event.getMessage());
@抑制警告(“原始类型”)
GenericMessage connectHeader=(GenericMessage)stompAccessor
.getHeader(SimpMessageHeaderAccessor.CONNECT_MESSAGE_HEADER);//修复程序找到传递用户名的方法
//到服务器
@抑制警告(“未选中”)
映射nativeHeaders=(映射)connectHeader.getHeaders()
.get(SimpMessageHeaderAccessor.NATIVE_头);
字符串login=nativeHeaders.get(“userId”).get(0);
字符串sessionId=stompAccessor.getSessionId();
logger.info(“用户与sessionId的聊天连接”,登录,sessionId);
}
@事件监听器
public void handleWebSocketDisconnectListener(SessionDisconnectEvent事件){
StompHeaderAccessor stompAccessor=StompHeaderAccessor.wrap(event.getMessage());
字符串sessionId=stompAccessor.getSessionId();
info(“用户与sessionId的聊天连接”,“Nop”,“sessionId”);
}
}
@Component
public class WebSocketEventListener {
private static final Logger logger = LoggerFactory.getLogger(WebSocketEventListener.class);
@Autowired
private SimpMessageSendingOperations messagingTemplate;
@EventListener
public void handleWebSocketConnectListener(SessionConnectedEvent event) {
StompHeaderAccessor stompAccessor = StompHeaderAccessor.wrap(event.getMessage());
@SuppressWarnings("rawtypes")
GenericMessage connectHeader = (GenericMessage) stompAccessor
.getHeader(SimpMessageHeaderAccessor.CONNECT_MESSAGE_HEADER); // FIXME find a way to pass the username
// to the server
@SuppressWarnings("unchecked")
Map<String, List<String>> nativeHeaders = (Map<String, List<String>>) connectHeader.getHeaders()
.get(SimpMessageHeaderAccessor.NATIVE_HEADERS);
String login = nativeHeaders.get("userId").get(0);
String sessionId = stompAccessor.getSessionId();
logger.info("Chat connection by user <{}> with sessionId <{}>", login, sessionId);
}
@EventListener
public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
StompHeaderAccessor stompAccessor = StompHeaderAccessor.wrap(event.getMessage());
String sessionId = stompAccessor.getSessionId();
logger.info("Chat connection by user <{}> with sessionId <{}>", "Nop", sessionId);
}