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