对于简短的回答,您必须使用一种称为长轮询的技术。
长答案请继续阅读。
您的问题的答案可能更主观,因为我们必须了解场景。客户在做什么?他想在同一个 HTTP 请求中得到结果吗?或者他对结果不感兴趣,或者他可以通过邮件或其他渠道查看结果?
假设您的客户在 20 分钟后对结果感兴趣。在这种情况下,您必须在系统中实现长轮询。在春季,我们有一个名为 DeferredResult 的类,它可以帮助您实现结果。
@RestController
@RequestMapping("/api")
public class BakeryController {
@GetMapping("/bake/{bakedGood}")
public DeferredResult<String> publisher(@PathVariable String bakedGood, @RequestParam Integer bakeTime) {
DeferredResult<String> output = new DeferredResult<>();
try {
Thread.sleep(bakeTime);
output.setResult(format("Bake for %s complete and order dispatched. Enjoy!", bakedGood));
} catch (Exception e) {
// ...
}
return output;
}
}
参考:-https://www.baeldung.com/spring-mvc-long-polling
现在假设您的客户对结果不感兴趣。他只是想执行一些 API,这个服务将完成它本来打算做的工作,并将结果发布到某个地方。在这种情况下,您可以通过 Active MQ 或 Kafka 使用异步处理,您的消费者将在其中处理结果,并将结果存储到所需的通道。通过这种方式实现,您可以立即返回释放线程的请求。
在 Active MQ 的帮助下使用此方法的示例,JMS 模板如下:-
@RestController
public class TestController {
@RequestMapping("/")
public ResponseEntity String someMethod(String requestPayload) {
// This will be async. It will put the message in the queue and
// will return the response.
jmsTemplate.send("your_queue_name", requestPayload);
ResponseEntity.status(HttpStatus.OK).build();
}
}