Чтобы вызвать этот API REST и получить данные дыр, я использую на каждой итерации нумерацию страниц с помощью параметров offset< /strong> и ограничение :
пример:
- вызов 1 :
Код: Выделить всё
http://localhost:8080/myapi/dwcopa/getSlice?**limit**=8000&**offset**=1&buCd=XXX
- вызов 2:
Код: Выделить всё
http://localhost:8080/myapi/dwcopa/getSlice?**limit**=8000&**offset**=2&buCd=XXX
.
.
- позвоните 760 :
Код: Выделить всё
http://localhost:8080/myapi/dwcopa/getSlice?**limit**=8000&**offset**=760&buCd=XXX
Пример: предел = 8000 и смещение 1: вызов вернет первые 8000 объектов json страницы с номером 1.
Чтобы получить 6212514 строк, мне нужно сделать 776 разбивка на страницы/вызов клиентского API REST (= 6212514/8000), чтобы получить все результаты, которые мне нужно сохранить либо в таблице сервера SQL базы данных, либо создать файл csv с этими 6212514 строками.
На самом деле я использую этот код в приложении Spring Boot (версия 2.5.1) (автономный Spring Boot, а не REST API) (Java 11/Spring webflux/Webclient) ) для использования клиентского RSt API и получения всех данных путем разбиения на страницы:
В классе службы JAVA:
My Spring Webclient для использования REST API:
Код: Выделить всё
public DwCopaServiceImpl() {
this.webClient = WebClient.builder()
.codecs(codecs ->codecs.defaultCodecs().maxInMemorySize(memSize) )
.baseUrl(API_BASE_URL)
.defaultHeader(HttpHeaders.CONTENT_TYPE, API_MIME_TYPE)
.build();
}
DwCopaEntity — это объект, который представляет строку (JSON) и содержит множество строковых полей:
Код: Выделить всё
public Mono getItems() {
String url = "/dwcopa/getSlice?limit="+limit+"&offset="+offset+"&buCd="+BUCD;
return fetchItems(url).expand(response -> {
if (**response.isLast()** ) {
return Mono.empty();
}
offset += 1 ;
return fetchItems("/dwcopa/getSlice?limit="+limit+"&offset="+offset+"&buCd="+BUCD);
}).flatMap(response -> Flux.fromIterable(response.getContent())).collectList();
}
private Mono fetchItems(String url) {
System.out.println(url);
return webClient.get().uri(url).retrieve().bodyToMono(ResponseApiNeo.class);
}
Код: Выделить всё
writeStreamToFile ( myService.getItems().block().parallelStream().map(data -> data.toString()), "C:\\Users\\myfolder\\Documents\\optfile.txt") ;
Есть ли лучшее решение для многопоточности:
- разбивка на страницы остатка API REST (760 страниц): (большой ответ данных: общий объем JSON 6 ГБ)
- Вставка всего ответа в SQL База данных или создайте CSV файл?
- Производительность имеет решающее значение (максимум 5 минут для получения всех данных).
- Должен ли я исправить свой код, чтобы ускорить работу/добавить потоки?
- Должен ли я исправить свой код, чтобы ускорить работу/добавить потоки?
li>
Подробнее здесь: https://stackoverflow.com/questions/681 ... n-response