Я использую систему актеров Akka внутри приложения Spring Boot. У меня запущен набор актеров.
Из моего класса Controller я вызываю свой класс обслуживания, который, используя шаблон запроса Actor, отправляет сообщение актеру и ожидает ответа. Ниже приведен код метода обслуживания:
public Mono<Future<SportEventDetailed>> getEventBySportAndLeagueId(Integer sportId, Integer leagueId) {
final ActorSelection actorSelection = bootstrapAkka.getActorSystem().actorSelection("/user/some/path");
final ActorMessage message = new ActorMessage()
final CompletionStage<Future<SportEventDetails>> futureCompletionStage = actorSelection.resolveOne(Duration.ofSeconds(2))
.thenApplyAsync(actorRef ->
Patterns.ask(actorRef, message, 1000)
.map(v1 -> (SportEventDetails) v1, ExecutionContext.global())
)
.whenCompleteAsync((sportEventDetailsFuture, throwable) -> {
// Here sportEventDetailsFuture is of type scala.concurrent.Future
sportEventDetailsFuture.onComplete(v1 -> {
final SportEventDetails eventDetails = v1.get();
log.info("Thread: {} | v1.get - onComplete - SED: {}", Thread.currentThread(), eventDetails);
return eventDetails;
}, ExecutionContext.global());
});
return Mono.fromCompletionStage(futureCompletionStage);
}
Хотя код контроллера прост:
@GetMapping(path = "{sportId}/{leagueId}")
public Mono<Future<SportEventDetails>> getEventsBySportAndLeagueId(@PathVariable("sportId") Integer sportId, @PathVariable("leagueId") Integer leagueId) {
return eventService.getEventBySportAndLeagueId(sportId, leagueId);
}
Когда клиент вызывает эту конечную точку, он получает либо {"success":true,"failure":false}
, либо null
( в виде строки).
Я подозреваю, что проблема для ответа null
заключается в том, что scala.concurrent.Future
не завершено до отправки ответа клиенту, но я не понимаю, почему он не завершится время, потому что я предполагаю, что Mono будет ждать завершения будущего
Проблема здесь в том, что Patterns.ask
возвращает scala.concurrent.Future<SportEventDetails>
, и я не смог найти способ преобразовать scala Future в Java CompletableFuture<SportEventDetails>
или CompletionStage<SportEventDetails>
.
Итак, мой вопрос: как я могу вернуть клиенту json представление SportEventDetails
при использовании шаблона Akka Patterns.ask (...) модель