1

Если весенний сеанс websocket пользователя магазина, как его получить, если я использую someHandler для размещения сеанса на карте, это означает, что размер карты может быть больше, чем 10w +, я не думаю, что это хорошоspring websocket + rabbitmq stomp: Как я могу получить все онлайн-пользователя и отключить подключение какого-либо пользователя?

SessionHandler.java

package hello; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Service; 
import org.springframework.web.socket.WebSocketSession; 

import java.io.IOException; 
import java.util.Map; 
import java.util.concurrent.ConcurrentHashMap; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 

@Service 
public class SessionHandler { 
    private static final Logger LOGGER = LoggerFactory.getLogger(SessionHandler.class); 
    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 

    private final Map<String, WebSocketSession> sessionMap = new ConcurrentHashMap<>(); 

    public SessionHandler() { 
     scheduler.scheduleAtFixedRate(new Runnable() { 
      @Override 
      public void run() { 
       sessionMap.keySet().forEach(k -> { 
        try { 
         sessionMap.get(k).close(); 
         sessionMap.remove(k); 
        } catch (IOException e) { 
         LOGGER.error("Error while closing websocket session: {}", e); 
        } 
       }); 
      } 
     }, 10, 10, TimeUnit.SECONDS); 
    } 

    public void register(WebSocketSession session) { 
     sessionMap.put(session.getId(), session); 
    } 

} 

как это:. https://github.com/isaranchuk/spring-websocket-disconnect/blob/master/src/main/java/hello/SessionHandler.java

+1

Пожалуйста, выкладываю фрагменты кода вы пробовали до сих пор. – Daenarys

+0

@ Двенадцать лет: https://github.com/isaranchuk/spring-websocket-disconnect/blob/master/src/main/java/hello/SessionHandler.java – Dreampie

ответ

0

Реализовать HandshakeInte r, как показано ниже.

public class HttpSessionIdHandshakeInterceptor implements HandshakeInterceptor { 

    public boolean beforeHandshake(ServerHttpRequest request, 
      ServerHttpResponse response, 
      WebSocketHandler wsHandler, 
      Map<String, Object> attributes) 
       throws Exception { 
     if (request instanceof ServletServerHttpRequest) { 
      ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; 
      HttpSession session = servletRequest.getServletRequest().getSession(false); 
      if (session != null) { 
       attributes.put(SESSION_ATTR, session.getId()); 
      } 
     } 
     return true; 
    } 

    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, 
           WebSocketHandler wsHandler, Exception ex) { 
    } 
} 

Затем добавьте в конечную точку.

public class WebSocketConfig extends 
     AbstractWebSocketMessageBrokerConfigurer { 

public void registerStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/portfolio") 
      .withSockJS() 
      .setInterceptors(new HttpSessionIdHandshakeInterceptor()); 

} 

... }

Далее мы можем создать ChannelInterceptorAdapter, который использует идентификатор сессии для обновления последнего доступа время использования весенней сессии. Например:

@Bean public ChannelInterceptorAdapter sessionContextChannelInterceptorAdapter() { 
return new ChannelInterceptorAdapter() { 
    @Override 
    public Message<?> preSend(Message<?> message, MessageChannel channel) { 
     Map<String, Object> sessionHeaders = SimpMessageHeaderAccessor.getSessionAttributes(message.getHeaders()); 
     String sessionId = (String) sessionHeaders.get(SESSION_ATTR); 
     if (sessionId != null) { 
      Session session = sessionRepository.getSession(sessionId); 
      if (session != null) { 
       sessionRepository.save(session); 
      } 
     } 
     return super.preSend(message, channel); 
    } 
}; 

}

+0

Спасибо, но я имею в виду, что показывать всех онлайн-пользователей на сервера и отключить любого пользователя, если я захочу – Dreampie