作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个在 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/
我有一个在 Jetty 上运行的 REST 网络服务。我想编写一个 Java 客户端,它使用相同的 Web 连接将大量文档分块到该其余服务。 我能够在这里建立一个基于迭代器的流方法: Sending
我是一名优秀的程序员,十分优秀!