У меня есть требование для разработки веб-службы на основе весенней загрузки с тегами @Async.
если возврат данных с сервера занимает много времени, как я могу разделить свой веб-сервис на несколько конечных точек, чтобы клиенту не приходилось ждать ответа от сервера.
Я пытался использовать три конечные точки.
1. localhost: 8080 / start -> клиент отправит запрос на данные. (возвращает номер запроса).
2. localhost: 8080 / checkprogress -> проверить прогресс, если данные готовы на сервере.
3. localhost: 8080 / done / requestId -> вернуть список данных
@ResponseBody
@GetMapping(value = "/start")
public ResponseEntity<String> start() {
String requestId = UUID.randomUUID().toString();
LOG.info("jobName" + requestId);
Job job = new Job("jobName" + requestId);
requestQueue.put(requestId.toString(), job);
service.submitWork(job);
return new ResponseEntity<String>(requestId, HttpStatus.ACCEPTED);
}
@ResponseBody
@RequestMapping(value = "/progress/{requestId}")
public ResponseEntity<String> fetchStatus(@PathVariable("requestId") String requestId) {
Job job = requestQueue.get(requestId);
if (job == null) {
return new ResponseEntity<String>("RequestId is either invalid or already served. requestId:" + requestId,
HttpStatus.BAD_REQUEST);
}
if (job.getState() == State.RUNNING || job.getState() == State.NEW)
return new ResponseEntity<String>(HttpStatus.NO_CONTENT);
if (job.getState() == State.DONE)
return new ResponseEntity<String>(HttpStatus.OK);
return null;
}
@ResponseBody
@RequestMapping(value = "/done/{requestId}")
public ResponseEntity<Object> done(@PathVariable("requestId") String requestId) {
LOG.info("removing requestId:" + requestId);
Job job = requestQueue.get(requestId);
if (job == null) {
return new ResponseEntity<Object>("RequestId is either invalid or already served. requestId:" + requestId,
HttpStatus.BAD_REQUEST);
}
// ResponseEntity<Object> response = new ResponseEntity<Object>(job.getList(),
// createHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE), HttpStatus.OK);
ResponseEntity<Object> response = new ResponseEntity<Object>(job.getListOfSecurities(),
createHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE), HttpStatus.OK);
requestQueue.remove(requestId);
return response;
}
Есть ли лучший способ сделать это стандартным способом в java8-приложении с весенней загрузкой, пожалуйста?