java - 将客户端 REQUEST_ENTITY_PROCESSING 设置为 CHUNKED 我丢失了文件

标签 java http jersey streaming

我有一个在 Jetty 上运行的 REST 网络服务。我想编写一个 Java 客户端,它使用相同的 Web 连接将大量文档分块到该其余服务。

我能够在这里建立一个基于迭代器的流方法:

Sending a stream of documents to a Jersey @POST endpoint

这不起作用,除非您设置 clientConfig.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED);,因为 Content-length 未知。

虽然有些工作,但分块传输似乎丢失了一些文档。例如:

num_docs 500000
numFound 499249

也许它正在发送像这样的 block :

{some:doc}, {some:doc}, {some:doc}, {some:doc}, {some:doc}, {some:doc}, {some:do

所以我每次都输了一些?更新:我错了。

如何让它不那样做?任何想法还有什么可能发生?

    ClientConfig clientConfig = new ClientConfig();
    clientConfig.property(ClientProperties.CONNECT_TIMEOUT, (int)TimeUnit.SECONDS.toMillis(60));
    clientConfig.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED);
    clientConfig.property(ClientProperties.ASYNC_THREADPOOL_SIZE, 100);
    clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, HttpClientFactory.createConnectionManager(name,
      metricRegistry, configuration));
    ApacheConnectorProvider connector = new ApacheConnectorProvider();
    clientConfig.connectorProvider(connector);
    clientConfig.register(new ClientRequestFilter() {
    @Override
    public void filter(ClientRequestContext requestContext) throws IOException {
      List<Object> orig = requestContext.getHeaders().remove(HttpHeaders.CONTENT_LENGTH);
      if (orig != null && !orig.isEmpty()) {
        requestContext.getHeaders().addAll("Length", orig);
      }
    }
    });
    clientConfig.register(new ClientRequestFilter() {
    @Override
    public void filter(ClientRequestContext requestContext) throws IOException {
      if (requestContext.getMediaType() != null &&
          requestContext.getMediaType().getType() != null &&
          requestContext.getMediaType().getType().equalsIgnoreCase("multipart")) {
        final MediaType boundaryMediaType = Boundary.addBoundary(requestContext.getMediaType());
        if (boundaryMediaType != requestContext.getMediaType()) {
          requestContext.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, boundaryMediaType.toString());
        }
        if (!requestContext.getHeaders().containsKey("MIME-Version")) {
          requestContext.getHeaders().putSingle("MIME-Version", "1.0");
        }
      }
    }
    });

最佳答案

关闭它 - 我不小心提前关闭了流,所以它确实缺少文档在最后这给了我提示要等到阻塞队列为空后再关闭执行程序。

关于java - 将客户端 REQUEST_ENTITY_PROCESSING 设置为 CHUNKED 我丢失了文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39818530/

相关文章:

java - java 的所有 lesscss 库都死了吗?

python - 将队列传递给 ThreadedHTTPServer

java - Jersey 2.11 和 ResourceMethodInitationHandlerProvider : MessageBodyWriter not found

http - Flutter:如何从 http 请求创建单例

tomcat - Jersey servlet 异常 tomcat

spring - 在 Spring 4.0 中使用 Jersey-spring

java - Struts 2操作调用丢失xwork i18n语言设置

java - 如何告诉 gradle 在构建时在项目中安装 npm?

java - Gradle 可以在没有 main() 的情况下执行 TornadoFX 应用程序,而 IntelliJ 不能......为什么?

api - 如何通过视频ID使用youtube api获取视频类别