только нагреть URI, а не ждать ответа в Spring Rest - PullRequest
0 голосов
/ 11 декабря 2018

Предположим, что я щелкаю URI localhost:8080/admin/hello с Hello классом POST JSON-объекта, используя POSTMAN, и получаю, например, 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 попал в контроллер, но не ждал ответа(потому что обработка всего процесса класса обслуживания занимает 10 секунд, но я хочу немедленно вернуться без ответа).

Как я могу это реализовать?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

вы можете включить Async, используя @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);
}
0 голосов
/ 11 декабря 2018

Вы можете включить асинхронную обработку, включив ее через конфигурацию.

@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;
    }
0 голосов
/ 11 декабря 2018

Переместите всю логику обработки в класс Service (если вы этого еще не сделали) и аннотируйте метод класса обслуживания с помощью @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
}

}

...