如何获取控制器中异步服务返回的数据 (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
}
我有一个控制器:
@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 }