Собрать последовательность постраничных результатов (776 страниц) из REST API (ответ JSON) и вставить окончательный резуJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Собрать последовательность постраничных результатов (776 страниц) из REST API (ответ JSON) и вставить окончательный резу

Сообщение Anonymous »

Я использую Rest API, который предоставляет 6212514 строк из базы данных SQL Server. Ответом REST API является JSON, который представляет строки базы данных.
Чтобы вызвать этот 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
limit — это количество возвращаемых объектов при каждом вызове API REST, а offset — номер страницы< /p>
Пример: предел = 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();
}
Я использую Reactive Mono[/b], чтобы не блокировать вызов API и перебирать всю нумерацию страниц с использованием метода response.isLast(), который имеет значение false (это поле указывает, что эта страница REST API — последний)
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") ;
Я новичок в webflux и Webclient. Этому решению требуется 25 минут для получения всех страниц REST API и создания текстового файла, который не проверяется клиентом:
Есть ли лучшее решение для многопоточности:
  • разбивка на страницы остатка API REST (760 страниц): (большой ответ данных: общий объем JSON 6 ГБ)
  • Вставка всего ответа в SQL База данных или создайте CSV файл?
  • Производительность имеет решающее значение (максимум 5 минут для получения всех данных).
  • Должен ли я исправить свой код, чтобы ускорить работу/добавить потоки?
  • Должен ли я исправить свой код, чтобы ускорить работу/добавить потоки?
    li>
Большое спасибо за помощь.

Подробнее здесь: https://stackoverflow.com/questions/681 ... n-response
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»