只加热URI,而不是在Spring Rest中等待响应



假设我使用POSTMAN点击带有Hello类POST JSON对象的URIlocalhost:8080/admin/hello,并有一个类似Controller的

@RequestMapping(value = "/hello", method = RequestMethod.POST)
public ResponseEntity<Hello> helloHome(@RequestBody Hello obj){
//here it goes to service class and doing processes...
return new ResponseEntity<Hello>(obj, HttpStatus.OK);
}

我只希望URI到达Controller,但不等待响应(因为处理所有服务类进程需要10秒,但我希望立即返回而不响应(。

我该如何实现它?

将所有处理逻辑移动到服务类(如果您还没有(,并用@Async注释您的服务类方法。这将使方法调用在单独的线程中执行,控制器方法不会等待服务类方法完成。

@RequestMapping(value = "/hello", method = RequestMethod.POST)
public ResponseEntity<Hello> helloHome(@RequestBody Hello obj){
helloHomeService.processRequest(obj);
return new ResponseEntity<Hello>(obj, HttpStatus.OK);
}
public Class HomeService{
@Async
public void processRequest(Hello obj){
//processing logic
}

}

您可以通过配置启用异步处理。

@Configuration
@EnableAsync
public class YourConfig

现在,您可以添加一个服务,并通过用@Async对其进行注释来对其方法之一启用异步处理。它将在调用后立即返回。

@Async
public void asyncMethodOnAService() {}

如果您希望服务返回值,您可以返回CompletableFuture

@Async
public CompletableFuture<String> asyncMethodOnAService() {}

调用异步方法的控制器可以返回一个DeferredResult,它将让客户端知道异步处理完成后结果将可用。

@RequestMapping(value = "/async", method = RequestMethod.GET)
public DeferredResult<ResponseEntity<String>> doAsync() {
DeferredResult<ResponseEntity<String>> result = new DeferredResult<>();
this.asyncService.asyncMethodOnAService().whenComplete((serviceResult, throwable) -> result.setResult(ResponseEntity.ok(serviceResult)));
return result;
}

您可以使用@EnableAsync:启用异步

@Configuration
@EnableAsync
class AsyncConfig{}
@Component  //in order to be scanned
class YourService{
@Async
public void asyncMethod(args){}
}
}
in your controller:
@Autowired
private YourService service;
....
public ResponseEntity<Hello> helloHome(@RequestBody Hello obj){
service.asyncMethode(params);
return new ResponseEntity<Hello>(obj, HttpStatus.OK);
}