HttpClient-从一个InputStream写入多个POST请求



我有一组服务器(可能彼此远程),它们都运行Tomcat,并使用Apache HttpClient通过HTTP进行通信。这些服务器中有很大一部分是数据存储,其中一个服务器是前端Web服务器,充当客户端和存储之间的中介。用户应该能够将文件上传到Web服务器,Web服务器会将该文件传递给给定数量的商店。

那么,问题是:是否可以将客户端上传的文件部分作为InputStream,并同时向商店写入多个POST请求?如果我只是简单地写入本地文件,那么显而易见的解决方案就是将InputStream的块读取到byte数组缓冲区中,然后从缓冲区依次写入每个输出,但我不知道如何说服HttpClient"共享"这样的流。

是的,我可以简单地将整个InputStream读取到Web服务器上的一个对象中,并按顺序将其写入每个存储,但由于我可能会接受非常大的文件,我必须将数据写入磁盘,然后为每个存储服务器回读,磁盘操作的数量可能会很快变得令人望而却步。这是一个我宁愿避免的实现。

如果商店没有足够的网络带宽,它将如何"共享"流?

你可以拆分传入的文件并将其传递到存储区,而无需将其写入磁盘,但如果只有一个存储区无法跟上,你就必须将该文件数据保存在内存中,直到它能够接受为止。如果它是一个大文件或多个用户,它可能会占用你所有的内存。

从技术上讲,我的意思是,你可以创建5个线程,以最快的速度将数据发送到存储区,并将文件数据保持在共享的FIFO结构中。当最后一个线程访问了一个部分并发送了该部分时,可以从数据结构中删除该数据,但之前不能删除。如果速度慢,数据结构可能会变得巨大。

数据必须在某个地方,如果不是内存和硬盘,那么在哪里?

因此,将传入的数据保留在内存中,直到(如果?)内存耗尽(永远不会?),然后将其刷新到硬盘。通过将数据发送到存储区,然后删除,继续尝试用数据清空数据结构。

您可以很容易地编写ExecutorService来处理数据的重新传输和清理数据结构,但它不会神奇地解决问题。:)

我还没有提供源代码,因为您似乎不想要这个解决方案。如果你接受了这样一个事实,即如果不在硬盘上缓冲数据,你就无法神奇地传递数据(或者更糟糕的解决方案是限制用户上传到MinimumBandwidth(store1、store2、store3、store4、store5)),你可能需要在以后实现它。

编辑/更改:

尽管我说过,但我不确定你是否真的想要ExecutiorService。我会创建自己的自定义线程来实际处理这个问题。我会从并发包创建一个Collection,可能是一个LinkedBlockingQueue,它包含字节数组(而不是字节,字节数组)。然后,我将从Thread->Integer创建一个映射,在传递数据时保存每个线程进程的当前索引。当所有进度数都在10以上时(意味着所有线程都发送了前10个块),然后我删除前10个字节数组,并从所有线程的进度中减去10来重置它。

创建自己的输出流。将尽可能多的HTTP POST客户端连接到此流。如果您的输出流收到Date,请将其发送到每个连接的POST客户端。

最新更新