У меня есть список 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;
Это был бы правильный подход?