Как отложить следующий асинхронный вызов API, если API не отвечает? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть список API, к которым я должен асинхронно подключаться и получать данные. В этом случае я создаю список callable задач. Вызываемый класс выглядит так:

public class ConnectToApiCallable implements Callable<ReturnedStringAndDate> {

*variables & constructor*

@Override
public ReturnedStringAndDate call() throws Exception {

        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
        clientHttpRequestFactory.setConnectTimeout(4000);
        RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);

        ReturnedStringAndDate stringAndDate = new ReturnedStringAndDate();
        stringAndDate.setJsonString(restTemplate.getForObject(url, String.class));

    return stringAndDate;
}
}

Способ создания списка вызываемых объектов:

public List<Callable<ReturnedStringAndDate>> createListOfCallableTasks(PoolList poolList){

    List<Callable<ReturnedStringAndDate>> callableList = new ArrayList<>();

    for (int i = 0; i < poolList.getPoolList().size(); i++)
        callableList.add(new ConnectToApiCallable(this.appendPoolApiUrl(poolList.getPoolList().get(i)), poolList.getPoolList().get(i).getName()));

    return callableList;
}

Я выполняю вызовы через ExecutorService интерфейс. Метод, который выполняет пул задач:

public void storePoolDataToDB(PoolList poolList, Long id) throws IOException, InterruptedException, ExecutionException{

    List<Future<ReturnedStringAndDate>> futureList = new ArrayList<>();

    try{
        futureList = executorService.invokeAll(this.createListOfCallableTasks(poolList));
    } catch (someExceptionsHere){}

    *some operations on futureList*
}

Теперь объяснение проблемы. Я не хочу создавать новые потоки для API, которые не отвечают неопределенно. Моя идея состоит в том, чтобы создать HashMap, который будет включать имя API в виде key и ряд ошибок в виде value. В зависимости от количества ошибок, я хотел бы отложить следующий вызов API. Чтобы достичь этого, мне нужно изменить мой метод createListOfCallableTasks.

То, о чем я подумал, это что-то вроде dateOfExecution для определенного API. В случае ошибки следующий звонок задерживается на 1/2/5/30 минут. Когда список задач сформирован, я бы проверил условие:

if (executionDate < OffsetDateTime.now()) 
    list.add(task);
else
    continue;

Это был бы правильный подход?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...