#asynchronous #server #protocol-buffers #grpc #scalapb
Вопрос:
Моему серверу требуются входные данные от нескольких клиентов, прежде чем отвечать на каждый из них, так как все входные данные зависят от другого. Поэтому я попытался использовать await
, Future
, и Promise
, но мне не повезло.
В этом примере только последний подключившийся клиент получает ответ, в то время как остальные ждут бесконечно. Это пример кода, так как в этом примере нет причин ждать, пока все клиенты отправят данные.
Сервер
var workerCount = 0; val numOfWorkers = 3; private class GreeterImpl extends GreeterGrpc.Greeter { override def assignID(req: GreeterRequest) = { workerCount = 1; val reply = ID(id = workerCount) val waitForAllToConnect: Future[String] = Future { while(workerCount != numOfWorkers){ // do nothing } "Success" } Await.ready(waitForAllToConnect, Duration.Inf) Future.successful(reply) } }
Клиент
var id = 0; def greet(greeting: String): Unit = { val request = GreeterRequest(greeting = greeting) val response = blockingStub.assignID(request) id = response.id; }
.файл proto
syntax = "proto3"; package protoGreet; service Greeter { rpc assignID(GreeterRequest) returns (ID) {} } message GreeterRequest { string greeting = 1; } message ID { int32 id = 1; }