我正在Spring Boot中将gprc双向流用于聊天应用程序,因为StreamObserver<T>对象用于将消息从服​​务器发送回客户端。因此,我想序列化StreamObserver<T>对象并将其转换为字节流,以将其存储在redis或其他数据库中。但是,由于StreamObserver<T>是不实现或扩展可序列化的接口。因此,我正在寻找一种解决方案,如何序列化它,因为大约有成千上万的用户正在使用聊天应用程序并将StreamObserver <T>存储在某些Map<String, StreamObserver<T>>中并不是一个好主意。

目前,我正在地图中存储StreamObserver<T>对象。
Map<String, StreamObserver<T>>
在此,地图键是聊天应用程序的用户ID,其值是StreamObserver对象,该对象包含onNext,onError,onCompleted函数,用于将消息从服​​务器发送到客户端

// Storing StreamObserver object with user Id
public static Map<String, StreamObserver<Chat.ChatMessageFromServer>> observersMap = new HashMap<String, StreamObserver<Chat.ChatMessageFromServer>>();


 @Override
public StreamObserver<Chat.ChatMessage> chat(final StreamObserver<Chat.ChatMessageFromServer> responseObserver) {

// responseObserver -> Storing it into a map. So, server could send message back to the client

        String user = grpcServerInterceptor.contextKey.get();
        System.out.println("");
        System.out.println("User : " + user);

        if (observersMap.get(user) == null) {

            System.out.println("New User : " + user);
            System.out.println("Adding User to observers map");
            System.out.println("");

            observersMap.put(user, responseObserver);
        } else {

            System.out.println("This User already exists in observersMap : " + user);
            System.out.println("By the way, Updating it");

            observersMap.put(user, responseObserver);
        }


  // This function sends message to client from Server
  public void sendMessageFromServerToClient(String user, String message) {

// Fetching StreamObserver from observersMap as defined above
 observersMap.get(user).onNext(Chat.ChatMessageFromServer.newBuilder().setMessage(Chat.ChatMessage.newBuilder().setTo(user).setFrom("Server").setMessage(message)).build());

            System.out.println("Pushed message to user : " + user);
            System.out.println("");

}


最佳答案

StreamObserver对应于实际TCP连接上的流。该资源无法转移到数据库。无法将其序列化到数据库以减少内存使用。

10-08 17:14