как сгенерировать исключение из аннотированного метода @Async - PullRequest
1 голос
/ 05 апреля 2019

У меня есть два модуля, один вызывает другой из шаблона отдыха.(администратор вызывает notifServer) У notifServer есть метод, помеченный @Async.Я хочу вызвать исключение в этом методе, но администратор получает ответ слишком быстро, и метод исключения не может быть перехвачен администратором.

Я новичок в Spring и процесс @Async.Я попытался отобразить тело ответа от NotifServer на C CompletableFuture.class.Но все равно я не получаю сообщение об ошибке.

Этот код от admin

ResponseEntity response = fcmRestTemplate.exchange(nsUrl + "/fcm/admin/" + bulkFcmId, HttpMethod.POST,
                    HttpEntityUtils.getHttpEntity(moduleCode), CompletableFuture.class);
            if (response.getStatusCode() != HttpStatus.CREATED && response.getStatusCode() != HttpStatus.ACCEPTED) {
                String errorMessage = ErrorResourceUtil.getErrorMessage((HashMap) response.getBody(),"Unable to send fcm");
                setStatusToFailedByBulkFcmId(bulkFcmId);
                throw new ClientException(errorMessage);
            }

, теперь это от NotifServer

JobExecution jobExecution = jobLauncher
                    .run(importJob, new JobParametersBuilder()
                    .addString("fullPathFileName", TMP_DIR)
                    .addString("batch_fcm_id", String.valueOf(id))
                    .addLong("time",System.currentTimeMillis())
                    .toJobParameters());
            if(jobExecution.getStepExecutions().stream().map(StepExecution::getStatus).findFirst().get().equals(BatchStatus.ABANDONED)){
             throw new ClientException("INVALID CSV");

Это аннотировано @ Async.

Так есть ли способ перехватить исключение клиента в теле ответа в Admin?

EDIT Это API от notifServer

@ResponseStatus(HttpStatus.CREATED)
    @PostMapping(value = "/admin/{bulkFcmId}")
    public void pushFCMByAdmin(@PathVariable Long bulkFcmId) {
        fcmService.sendFcmByAdmin(bulkFcmId, AuthUtil.getCurrentUser());
    }

Тогда sendFcmByAdmin имеет аннотацию @Async.

1 Ответ

0 голосов
/ 05 апреля 2019

В приведенном ниже коде вы можете указать тип возврата как бизнес-объект, а не как CompletableFuture.class. Поскольку вы передаете CompletableFuture.class в качестве параметра для обмена, он ожидает ответ возвращаемое значение типа CompletableFuture.class.

ResponseEntity response = fcmRestTemplate.exchange(nsUrl + "/fcm/admin/" + bulkFcmId, HttpMethod.POST,
                        HttpEntityUtils.getHttpEntity(moduleCode), CompletableFuture.class);
                if (response.getStatusCode() != HttpStatus.CREATED && response.getStatusCode() != HttpStatus.ACCEPTED) {
                    String errorMessage = ErrorResourceUtil.getErrorMessage((HashMap) response.getBody(),"Unable to send fcm");
                    setStatusToFailedByBulkFcmId(bulkFcmId);
                    throw new ClientException(errorMessage);
                }

Вместо того, чтобы передавать Completable Future, вы можете попробовать создать его следующим образом:

Используйте асинхронный метод для вызова остальных шаблонов в admin:

@Async
public CompletableFuture<List<BusinessObject>> getResponseAsynchronously(String value) {
    String url = "https://restendpoint.eu/rest/v2/lang/" + value + "?fields=name";
    BusinessObject[] response = restTemplate.getForObject(url, Country[].class);
    return CompletableFuture.completedFuture(Arrays.asList(response));
}

затем в контроллере читайте CompletableFuture как:

@GetMapping("")
public List<String> getAllDataFromRestCall() throws Throwable {

    CompletableFuture<List<BusinessObject>> businessObjectsFuture = countryClient.getResponseAsynchronously("fr");
    List<String> europeanFrenchSpeakingCountries;

            try {
                europeanFrenchSpeakingCountries = new ArrayList<>(businessObjectsFuture
                .get()
                .stream()
                .map(Country::getName)
                .collect(Collectors.toList()));

     } catch (Throwable e) {
       throw e.getCause();
     }

   return europeanFrenchSpeakingCountries;
}
...