Как создать исходный текст Akka из клиента RestApi
Я хочу, чтобы потоковые объекты, которые читаются через Java-клиент RestApi. Клиент читает набор данных постраничным способом.
Решение, которое я придумал, состояло в том, чтобы создать Источник из Итерируемого, где эта итерация лениво загружает страницы, поскольку источник получает потребность в большем количестве элементов.
Это выглядит примерно так:
Source.from(myClient.getObjects())
public class MyClient<T> {
public Iterable<T> getObjects() {
return new Iterable<T>() {
@Override
@Nonnull
public Iterator<T> iterator() {
return new MyIterator<>(this);
}
};
}
private class MyIterator<T> implements Iterator<T> {
private final MyClient client;
private final Queue<T> latestPage;
boolean end = false;
MyIterator(MyClient client) {
this.client = client;
latestPage = new LinkedList<>();
latestPage.addAll(loadNextPage());
}
private Collection<T> loadNextPage() {
Collection<T> nextPage = client.getNextPage();
if (nextPage.isEmpty()) {
end = true;
}
return nextPage;
}
@Override
public boolean hasNext() {
if (latestPage.isEmpty() && (!end)) {
latestPage.addAll(loadNextPage());
}
return !latestPage.isEmpty();
}
@Override
public T next() {
return latestPage.poll();
}
}
}
Кажется, это работает нормально. Но потом я заметил это в документации:
Source.from () Потоковые значения Iterable. Убедитесь, что Iterable неизменен или, по крайней мере, не изменен после использования в качестве источника.
Вопросы:
- Это хороший подход для потоковой передачи постраничных элементов?
- MyIterator изменчив. Это вызовет проблемы?
- В чем разница между Source.from и Source.fromIterator