Что является стандартным способом проектирования высокопроизводительной пружинной веб-службы с учетом Async - PullRequest
0 голосов
/ 24 июня 2019

У меня есть требование для разработки веб-службы на основе весенней загрузки с тегами @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-приложении с весенней загрузкой, пожалуйста?

...