如何获取控制器中异步服务返回的数据 (Java)

How to fetch data returned by a asynchronous Service in a controller (Java)

我有一个控制器:

@PostMapping("/xyz")
void getThatMessageAndEmail(@RequestBody(Integer z))
{
   String messageToCatch = MG.messageGetter(z);
   System.out.println(functionToConcat(z,messageToCatch));
}

还有我的服务 messageGetter,它是一个异步服务:

@Service
class MG()
{
    @Async
    String messageGetter(Integer z)
    {
      return "HELLOFRIEND";
    }
}

现在,我无法在控制器中接收到消息“HELLOFRIEND”。 如何在控制器中捕获消息(messageToCatch 变量)?

第一个:Async methods must be public! ;-)

然后,您必须将 return 类型重构为 Future<String/CompletableFuture<String>:

@Async
public Future<String> messageGetter(Integer z)
// alternatively CompletableFuture<String> ...
{
  // and provide it accordingly:
  return new AsyncResult<String>("HELLOFRIEND");// or CompletableFuture.of("HELLOFRIEND");
}

在控制器中,您将:

  • 阻止异步执行,直到 return 或异常:

    String messageToCatch = MG.messageGetter(z).get(); // in both cases.. 
    
  • 或(同时做点什么):

    Future<String> fut = MG.messageGetter(z);
    while (true) {
       if (fut.isDone()) { // done!
          System.out.println(functionToConcat(z, fut.get()));
          break;
       }
       // do something else
    }