如何从RestApi客户端创建Akka源

时间:2018-12-02 10:18:32

标签: java akka-stream

我想流式传输通过RestApi Java客户端读取的对象。 客户端以分页的方式读取数据集。

我想出的解决方案是从Iterable创建一个Source,在该Iterable中,随着Source对更多元素的需求,它会延迟加载页面。

它看起来像这样:

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();
        }
    }
}

这似乎很好。但是后来我在文档中注意到了this

  

Source.from()流可迭代的值。确保可迭代   在用作来源后是不变的,或者至少没有被修改。

问题:

  1. 这是流式传入分页元素的好方法吗?
  2. MyIterator是可变的。这会引起问题吗?
  3. Source.from和Source.fromIterator有什么区别

0 个答案:

没有答案