Ответ немного зависит от того, как будут идентифицироваться клиенты.Если первоначальный запрос предоставлял дескриптор (например, имя пользователя, но не был зарегистрирован заранее), то вы могли бы просто дождаться первого 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.