Будущее в акке сообщение - PullRequest
0 голосов
/ 02 октября 2019

добрый день всем. У меня есть вопрос о том, как плохо установить CompletableFuture в сообщении от одного актера к другому и использовать get (), чтобы дождаться его завершения. у меня есть пример кода, который я считаю слишком сложным для использования на практике, но не могу найти подходящих аргументов для совета по его рефакторингу

код, который отправляет сообщения с будущим

private void onSomeSignal(SomeMsg smsg){
   MessageToActor msg = new MessageToActor()
   future = new CompletableFuture<>();
   msg.setFuture(future);
   actortRef.tell(msg, null);
   response = future.get(2, TimeUnit.SECONDS);
   /* do something with responce*/
}

кодом, который завершаетсяfuture (в другом актере)

private void onSomeSignal(MessageToActor msg){
   response = responseService.getResponse();
   msg.getFuture().complete(response);
}

здесь что-то не так, за исключением того, что future.get () блокирует операцию

1 Ответ

2 голосов
/ 03 октября 2019

Да, выполнение этого вернется и укусит вас: с этим шаблоном вы блокируете одного актера до тех пор, пока какой-то другой актер не ответит, что означает, что если вы используете это в другом месте в вашей программе, существует высокий риск зайти в тупик (т.е. вся ваша программа останавливается и не может продолжаться).

Вместо того, чтобы использовать Future для отправки ответа, актеры созданы для отправки сообщений. В «другом актере» вы должны использовать getContext().getSender().tell(response), а в первом акторе вы должны обрабатывать этот ответ как обычное сообщение вместо вызова future.get().

...