Исполнители Java не требуют для всех итераций цикла - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь запустить исполнителей на 100 задач.В настоящее время он работает для 10 задач, но когда я отправляю запрос с 11 задачами, 1 не выполнится (все, что больше 10, не выполнится).Когда я его отладил, я понял, что вызовы для задачи 11 вообще не вызывались, и я еще не понял, что там не так.Пожалуйста, дайте мне знать, если что-то не так в коде.

Контроллер:

@RequestMapping(value = "/loaderquote", method = RequestMethod.POST)
public ResponseEntity<Object> getQuoteForLoader(@RequestBody List<JSONObject> getQuoteJson,
        @RequestParam("productcode") String productCode, @RequestHeader("Authorization") String authorization) {
    logger.info("Entered into getQuoteForLoader()");
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("Access-Control-Allow-Origin", "*");
    try {
        return motorService.getQuoteForLoader(getQuoteJson, productCode, authorization);
    } catch (Exception e) {
        logger.error("Failed getQuoteForLoader()", e);
        return new ResponseEntity<Object>(e.getMessage(), responseHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

Сервис:

@Scheduled(fixedRate = 3600000)
public ResponseEntity<Object> getQuoteForLoader(List<JSONObject> getQuoteJson, String productCode,
        String authorization) throws ParseException, IOException, Exception {
    logger.info("Entered into getQuoteForLoader()");
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("Access-Control-Allow-Origin", "*");
    CompletableFuture<JSONArray> future = null;
    JSONArray responseArray = new JSONArray();
    try {
        executor = Executors.newCachedThreadPool();
        for (int i = 0; i < getQuoteJson.size(); i++) {
            Thread.sleep(2000);
            JSONObject jsonObject = (JSONObject) getQuoteJson.get(i);
            future = CompletableFuture.supplyAsync(() -> {
                // ResponseEntity<Object> responseEntity =
                // motorValidation.issuePolicyValidation(jsonObject,
                // authorization);
                // if (responseEntity.getStatusCode() == HttpStatus.OK &&
                // responseEntity.getBody() != null) {
                JSONObject response = asynCallService.getQuoteAsyncService(jsonObject, productCode, authorization);
                responseArray.add(response);
                // }
                return responseArray;
            }, executor);
        }
        return new ResponseEntity<Object>(future.get(), responseHeaders, HttpStatus.OK);
    } catch (Exception e) {
        logger.error("Failed getQuoteForLoader()", e);
        // return new ResponseEntity<Object>(e.getMessage(),
        // responseHeaders,
        // HttpStatus.INTERNAL_SERVER_ERROR);
        throw e;
    } finally {
        executor.shutdown();
        try {
            executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            logger.error("Not terminated properly in getQuoteForLoader().", e);
        }
    }

}

1 Ответ

0 голосов
/ 17 сентября 2018

Вы можете изменить код следующим образом,

List<CompletableFuture<JSONObject>> listOfCompletableFutures = new ArrayList<>();
        JSONArray responseArray = new JSONArray();
        try {
            executor = Executors.newCachedThreadPool();
            for (int i = 0; i < getQuoteJson.size(); i++) {
                JSONObject jsonObject = (JSONObject) getQuoteJson.get(i);
             CompletableFuture<JSONObject>   future = CompletableFuture.supplyAsync(() -> {
                    // ResponseEntity<Object> responseEntity =
                    // motorValidation.issuePolicyValidation(jsonObject,
                    // authorization);
                    // if (responseEntity.getStatusCode() == HttpStatus.OK &&
                    // responseEntity.getBody() != null) {
                    JSONObject response = asynCallService.getQuoteAsyncService(jsonObject, productCode, authorization);

                    // }
                    return response;
                }, executor);
listOfCompletableFutures.add(future);
            }

    for(CompletableFuture<JSONObject> future : listOfCompletableFutures){
       responseArray.add(future.get());
    }
            return new ResponseEntity<Object>(responseArray, responseHeaders, HttpStatus.OK);
        } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...