How can we initialize new instance variables for every websocket connection

Viewed 19

How can we initialize new instance variables for every websocket connection.

I have websocket spring boot application and when a new websocket connection is initiated I want to initialize new instance variables.

Suppose I have two websocket clients "client-1" and "client-2". When "client-1" is connected to the websocket server, a boolean instance variable (default value is false) is initialized in the WebSocketHandler class and when "client-1" sends some message this variable will be true or false. Will happen.

After that "client-2" gets connected to the websocket server, so how can we initialize a separate new instance variable for "client-2"?

Right now when "client-1" change instance variable value to true, the same value will appear in "client-2" after websocket connect.

Configuration File:

@Configuration
@EnableWebSocket
public class SocketConfiguration implements WebSocketConfigurer
{
   private final String[] wsPath = {"/{version}/producer/ws/{token}/{device_code}/{device_number}", "/{version}/producer/ws/{token}/{device_code}/{device_number}/"};

   @Autowired
   @Qualifier(value = "deviceServiceImpl")
   private DeviceService deviceService;

   public SocketInterceptor socketInterceptor() {
     return new SocketInterceptor(deviceService);
   }

   public SocketHandler socketHandler() {
     return new SocketHandler();
   }

   @Override
   public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) 
   {
      registry.addHandler(socketHandler(), wsPath).addInterceptors(socketInterceptor()).setAllowedOrigins("*");
   }
}

HandshakeInterceptor File:

@Slf4j
public class SocketInterceptor implements HandshakeInterceptor
{
   private DeviceService deviceService;

   public SocketInterceptor(DeviceService deviceService) {
      this.deviceService = deviceService;
   }

   @Override
   public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception 
   {
      try 
      {
          Map<String, Object> map = deviceService.findDeviceByNumber(request);
          attributes.putAll(map);
      }
      catch (CustomErrorException e) {
          attributes.put("code", e.getCode());
          attributes.put("data", e.getMessage());
      }
      catch (Exception e) {
          StringWriter stringWriter = new StringWriter();
          PrintWriter printWriter = new PrintWriter(stringWriter);
          e.printStackTrace(printWriter);
          log.error("[{}] "+stringWriter.toString(), request.getRemoteAddress());
        
          attributes.put("code", CloseStatus.SERVER_ERROR.getCode());
          attributes.put("data", "Internal Server Error. Please try again after some time.");
      }
      return true;
  }

   @Override
   public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) 
   {
       log.info("Handshake Success...");
   }
}

WebSocketHandler File:

@Slf4j
public class SocketHandler implements WebSocketHandler
{
   private boolean isSocketConnect = false;
   
   @Override
   public void afterConnectionEstablished(WebSocketSession session) throws Exception 
   {
       System.out.println("isSocketConnect: "+isSocketConnect);
       ......
       ......
       ......
       isSocketConnect = true;
   }

   @Override
   public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception 
   {
       if(message instanceof TextMessage) {
          handleTextMessage(session, (TextMessage) message);
       }
       else if(message instanceof BinaryMessage) {
          handleBinaryMessage(session, (BinaryMessage) message);
       }
       else if(message instanceof PongMessage) {
          handlePongMessage(session, (PongMessage) message);
       }
       else {
          throw new IllegalStateException("Unexpected WebSocket message type: "+message);
       }
   }

   protected void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException
   {
      try 
      {
          if(isSocketConnect)
          {
             log.info("Session: {} Receive Text message, MSG: {}", session.getId(), message.getPayload());
            
            
          }
      }
      catch (Exception e) {
         StringWriter stringWriter = new StringWriter();
         PrintWriter printWriter = new PrintWriter(stringWriter);
         e.printStackTrace(printWriter);
         log.error("[{}] "+stringWriter.toString(), session.getRemoteAddress());
      }
   }
0 Answers
Related