以正确的方式返回输入流

时间:2014-08-14 17:45:59

标签: java multithreading stream inputstream

我可能不在这里,但在我实施之前,我想确保我正确理解我在这里做的是场景:

A类负责收集文档信息(ID,内容等...)我循环收集文档块(可配置)但是例如,我们一次说10000个文档。

public class A{
    private List<Documents> docs = new ArrayList<Documents>

    public InputStream retrieveAllDocuments(){
        // Loop here to retrive the 10000 document chunk.
        while(docs.size() < 10000000){
            List<TrimmedDownDoc> tempList = callSlowApiToRetrieveDoc();
            ExecutorService.call(InnerA);
        }


        return an InputStream;
    }

    private class InnerA implements Callable<Boolean> {
         private List<TrimmedDownDoc> tempList

         public InnerA(List<...> tempList){
             this.tempList = tempList;
         }

         public Boolean call() {
             // extract temp list and populate docs list in a threadsafe manner.

             // Once this is done I would like to push them to the stream
         }
    }
}

我正在研究最佳方法,因此A类消费者可以在流文档可用时读取。这将阻止A类构建一个文档列表,这些文档将是数百万个长期影响内存使用的文档。目前我并没有真正看到除了保存到临时文件之外的其他选择,但我想通过使用正确的Java对象/流来避免这种情况。

谢谢,

1 个答案:

答案 0 :(得分:0)

我可能偏离基础,但在这种情况下最好使用Observer / Subscriber模式吗?如果您这样做,您可以在准备好时返回准备好的每个文档,而不必担心构建任何类型的List。如果调用者想要一个List或存储一些文档,则由调用者决定。否则,您只需获取下一个文档,让用户担心无论如何担心。