答案在一定程度上取决于如何识别客户。如果初始请求提供了句柄(如用户名,但未提前注册),那么您可以等待第一个 onNext():
public StreamObserver<Chat.ChatMessage> chat(StreamObserver<Chat.ChatMessageFromServer> responseObserver) {
return new StreamObserver<Chat.ChatMessage>() {
@Override
public void onNext(Chat.ChatMessage value) {
String userHandle = value.getHandle();
// observers would now be a map, not a set
observers.put(userHandle, responseObserver);
...
假设所有用户都已登录,并在标头中提供一个令牌,例如 OAuth。然后,您将使用拦截器对用户进行身份验证,并使用 Context 将其传播到应用程序,如 https://stackoverflow.com/a/40113309/4690866 。
public StreamObserver<Chat.ChatMessage> chat(StreamObserver<Chat.ChatMessageFromServer> responseObserver) {
// USER_IDENTITY is a Context.Key, also used by the interceptor
User user = USER_IDENTITY.get();
observers.put(user.getName(), responseObserver);
return new StreamObserver<Chat.ChatMessage>() {
...
当识别仅适用于这个 RPC 时,第一个更容易/更好。当标识适用于许多 RPC 时,第二个更容易/更好。