【问题标题】:There is no suitable serializer for class org.springframework.web.socket.adapter.standard.StandardWebSocketSessionorg.springframework.web.socket.adapter.standard.StandardWebSocketSession 类没有合适的序列化程序
【发布时间】:2020-05-23 07:30:07
【问题描述】:

项目的一个用例是当用户使用 userId 连接到服务器时,应维护会话。如果发生任何服务器事件(添加记录或在任何业务逻辑中),我们应该通知连接的用户。

我正在尝试在 hazelcast 中保留 websocket 会话,以便在任何实例出现故障时它对所有应用程序实例都可用。

导入 com.fasterxml.jackson.databind.ObjectMapper; 导入 com.hazelcast.config.Config; 进口 com.hazelcast.core.Hazelcast; 导入 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);
    }

在运行期间发生以下异常。

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)

【问题讨论】:

    标签: java spring-boot hazelcast java-websocket hazelcast-imap


    【解决方案1】:

    首先,WebSocketSession 不是 Serializable,因此您的错误。

    然后,从概念的角度来看,不可能保持有状态的连接(例如 FTP、WebSocket 等)。你应该怎么做它保留所有连接参数,然后如果节点上的连接断开,则从另一个实例重新打开连接。

    【讨论】:

    • 您能否指导使用 websocket 的任何工作示例来实现相同的目标。
    • 对不起,但在我的回答中,我试图解释为什么它不能工作,以及为什么你不应该这样做。创建一个web socket连接设置类Serializable,用相关值创建这样一个类的实例,这是你可以存储的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2019-03-10
    • 1970-01-01
    • 2014-02-17
    相关资源
    最近更新 更多