Springboot: параллельная обработка списка элементов - PullRequest
0 голосов
/ 20 февраля 2020

Я разрабатываю вызов API, который принимает список имен приложений и возвращает карту с именем приложения в качестве ключа и списком тегов изображений, которые соответствующее приложение имеет в доверенном хранилище docker. Обычно размер входного списка составляет около 10. Но, поскольку выполнение запроса DTR для каждого приложения занимает около 3-4 секунд, среднее время ответа API составляет 35-40 секунд. Я пытаюсь сделать параллельный вызов для всех приложений в списке. Я использовал CompletableFuture с @Async методом, но это не помогает сократить время отклика. Вот мой код:

Map<String, List<String>> getAppsImageMapResp(List<String> apps, String pageSize) {
    Map<String, List<String>> appTagsMap = new ConcurrentHashMap<>()
    for(String app : apps) {
        CompletableFuture<List<String>> appImageList = supplyAsync({ ->
            getDockerRepoTags(app, pageSize)
        })
        appTagsMap.put(application, appImageList.get())
    }
    return appTagsMap
}

@Async
List<String> getDockerRepoTags(String app, String pageSize) {
    return restTemplate.exchange("https://dtrhost/org/${app}/tags?pageSize=${pageSize}")
}
...