One of the use cases of project is when user connects to the server with userId the session should be maintained. If any server events happen (a record added or in any business logic) we should notify the connected user.
I'm trying to persist the websocket session in hazelcast so that it will be available to all the application instances if any instance goes down.
import com.fasterxml.jackson.databind.ObjectMapper; import com.hazelcast.config.Config; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import org.springframework.session.web.socket.events.SessionConnectEvent;
@Component
public class SocketHandler extends TextWebSocketHandler {
List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
private static final Object LOCK = new Object();
private Map<String, WebSocketSession> userSessionMap = new HashMap<>();
//Session s = null;
Config cfg = new Config();
HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
Map<String, SessionConnectEvent> sharedData = instance.getMap("shared");
@Override
@SuppressWarnings("unchecked")
public void handleTextMessage(WebSocketSession session, TextMessage message)
throws InterruptedException, IOException {
Map<String, String> value = new ObjectMapper().readValue(message.getPayload(), Map.class);
String userId = value.get("userId");
synchronized(LOCK) {
if(!sharedData.containsKey(userId)) {
sharedData.put(userId, session);
}
}
session.sendMessage(new TextMessage("Hello " + value.get("userId") + ". Your Trip Notifications appear below !"));
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
}
During run time below exception occur.
com.hazelcast.nio.serialization.HazelcastSerializationException: There is no suitable serializer for class org.springframework.web.socket.adapter.standard.StandardWebSocketSession
at com.hazelcast.nio.serialization.SerializationServiceImpl.toData(SerializationServiceImpl.java:218)
at com.hazelcast.nio.serialization.SerializationServiceImpl.toData(SerializationServiceImpl.java:203)
at com.hazelcast.map.impl.AbstractMapServiceContextSupport.toData(AbstractMapServiceContextSupport.java:68)
at com.hazelcast.map.impl.DefaultMapServiceContext.toData(DefaultMapServiceContext.java:28)
at com.hazelcast.map.impl.proxy.MapProxySupport.toData(MapProxySupport.java:1042)
at com.hazelcast.map.impl.proxy.MapProxyImpl.put(MapProxyImpl.java:101)
at com.hazelcast.map.impl.proxy.MapProxyImpl.put(MapProxyImpl.java:89)
at com.ecab.driver.socket.SocketHandler.handleTextMessage(SocketHandler.java:43)
at org.springframework.web.socket.handler.AbstractWebSocketHandler.handleMessage(AbstractWebSocketHandler.java:43)
at org.springframework.web.socket.handler.WebSocketHandlerDecorator.handleMessage(WebSocketHandlerDecorator.java:75)
at org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator.handleMessage(LoggingWebSocketHandlerDecorator.java:56)
at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.handleMessage(ExceptionWebSocketHandlerDecorator.java:58)