gpt4 book ai didi

Java Sonatype 异步 HTTP 客户端上传进度

转载 作者:行者123 更新时间:2023-12-02 07:48:01 25 4
gpt4 key购买 nike

我正在尝试使用 sonatype 异步 http 客户端实现异步文件上传 - https://github.com/sonatype/async-http-client .

我尝试了文档中建议的方法。使用传输监听器。 http://sonatype.github.com/async-http-client/transfer-listener.html

我实现了TransferListener接口(interface)的onBytesSent(只是作为测试):

public void onBytesSent(ByteBuffer byteBuffer) {

System.out.println("Total bytes sent - ");
System.out.println(byteBuffer.capacity());
}

然后在另一个线程中(因为我不想阻止该应用程序)我尝试执行以下操作:

TransferCompletionHandler tl = new TransferCompletionHandler();
tl.addTransferListener(listener);

asyncHttpClient.preparePut(getFullUrl(fileWithPath))
.setBody(new BodyGenerator() {
public Body createBody() throws IOException {
return new FileBodyWithOffset(file, offset);
}
})
.addHeader(CONTENT_RANGE, new ContentRange(offset, localSize).toString())
.execute(handler).get();

一切都很好。文件上传正确且速度非常快。但问题是 - 我仅在上传完成后才从 TransferListener 中的 onBytesSent 收到消息。例如,上传在 10 分钟内完成。在那10分钟里我什么也没得到。只有在此之后,所有内容才会打印在控制台上。

我不知道这段代码有什么问题。我只是尝试遵循文档。

我尝试在主线程中执行上面的代码,但也没有成功。

也许使用此客户端实现上传进度监听器的方法是错误的?

最佳答案

我自己来回答。我没能用 TransferListener 解决这个问题。所以我尝试了另一种方式。

我已将进度逻辑放入 Body 接口(interface)实现中(在 read 方法中):

public class FileBodyWithOffset implements Body {

private final ReadableByteChannel channel;

private long actualOffset;

private final long contentLength;

public FileBodyWithOffset(final File file, final long offset) throws IOException {

final InputStream stream = new FileInputStream(file);

this.actualOffset = stream.skip(offset);

this.contentLength = file.length() - offset;

this.channel = Channels.newChannel(stream);
}


public long getContentLength() {

return this.contentLength;
}

public long read(ByteBuffer byteBuffer) throws IOException {

System.out.println(new Date());

actualOffset += byteBuffer.capacity();

return channel.read(byteBuffer);
}

public void close() throws IOException {

channel.close();
}

public long getActualOffset() {

return actualOffset;
}
}

也许这是一个肮脏的伎俩,但至少它有效。

关于Java Sonatype 异步 HTTP 客户端上传进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10573211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com