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());
}
}