Tôi có một ứng dụng khách cần tải lên tệp đủ lớn để yêu cầu thanh tiến trình.
Vấn đề là, đối với tải lên yêu cầu một vài phút, tôi thấy các byte được chuyển đến 100% ngay sau khi ứng dụng đã bắt đầu. Sau đó, phải mất vài phút để in chuỗi "đã hoàn tất".
Dường như các byte được gửi đến bộ đệm, và tôi đã đọc tốc độ bộ đệm chuyển đến tốc độ tải thay vì tốc độ tải lên thực tế. Điều này làm cho thanh tiến trình vô ích.Tiến trình tải lên của khách hàng Jersey
Đây là mã rất đơn giản:
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource resource = client.resource("www.myrestserver.com/uploads");
WebResource.Builder builder = resource.type(MediaType.MULTIPART_FORM_DATA_TYPE);
FormDataMultiPart multiPart = new FormDataMultiPart();
FileDataBodyPart fdbp = new FileDataBodyPart("data.zip", new File("data.zip"));
BodyPart bp = multiPart.bodyPart(fdbp);
String response = builder.post(String.class, multiPart);
Để có được nhà nước tiến bộ tôi đã thêm một bộ lọc ContainerListener, obviouslt trước khi gọi builder.post:
final ContainerListener containerListener = new ContainerListener() {
@Override
public void onSent(long delta, long bytes) {
System.out.println(delta + " : " + long);
}
@Override
public void onFinish() {
super.onFinish();
System.out.println("on finish");
}
};
OnStartConnectionListener connectionListenerFactory = new OnStartConnectionListener() {
@Override
public ContainerListener onStart(ClientRequest cr) {
return containerListener;
}
};
resource.addFilter(new ConnectionListenerFilter(connectionListenerFactory));
cảm ơn Tomasz, câu trả lời này rất tốt. Thực tế là bạn đã cung cấp hai cách để cấu hình máy khách thực sự đáng ngưỡng mộ và giải thích. không may, vấn đề vẫn tồn tại. Tôi chỉ cần đặt một System.out.println (...) sau entityStream.write, nhưng kết quả là tôi viết các tệp lớn (> 10MB) trong một phần nhỏ của giây, và sau đó nó đóng băng trong khi tải lên "thực" sẽ xảy ra.Thực tế cũng xảy ra với giải pháp này có nghĩa là vấn đề là ở nơi khác. Đối với câu trả lời của bạn, tôi không thể chấp nhận nó nhưng tôi có thể bắt đầu một câu hỏi cụ thể khác mà tôi sẽ rất vui khi đánh dấu nó là chính xác. :-) – AgostinoX
Tôi cũng cố gắng thêm một entityStream.flush(); sau entityStream.write (...) để ép một văn bản thực tế vào socket thay vì chỉ viết trên bộ đệm. Cùng một kết quả :-( – AgostinoX
ok, câu trả lời tuyệt vời, nó hoạt động theo cả hai cách, đó là với người nghe và với nhà cung cấp tệp tùy chỉnh. Có lẽ cần nhấn mạnh rằng giải pháp là phần thứ hai, có thể di chuyển nó ở trên cùng. Ngoài ra, nó giúp làm rõ kiến trúc áo, vì vậy tôi sẽ giữ nó, nhưng không phải là câu trả lời trực tiếp cho câu hỏi. – AgostinoX