Tengo un cliente de jersey que necesita cargar un archivo lo suficientemente grande como para requerir una barra de progreso.
El problema es que, para una carga que requiere algunos minutos, veo los bytes transferidos para ir al 100% tan pronto como la aplicación ha comenzado. Luego, toma algunos minutos imprimir la secuencia "en acabado".
Es como si los bytes se hubieran enviado a un búfer, y estaba leyendo la velocidad de transferencia al búfer en lugar de la velocidad de carga real. Esto hace que la barra de progreso sea inútil.progreso de carga del cliente de Jersey
El código muy simple:
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);
Para conseguir el progreso del estado He añadido un filtro ContainerListener, obviouslt antes de llamar 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));
gracias Tomasz, esta respuesta es muy buena. El hecho de que haya proporcionado dos formas de configurar al cliente es realmente admirable y explicativo. desafortunadamente, el problema persiste. Acabo de poner un System.out.println (...) después de entityStream.write, pero el resultado es que escribo archivos grandes (> 10MB) en una fracción de segundo, y luego se congela mientras ocurre la carga "real".El hecho de que esto ocurra también con esta solución significa que el problema está en otra parte. Por su respuesta, no puedo aceptarlo pero puedo comenzar otra pregunta específica en la que me complacerá marcarla como correcta. :-) – AgostinoX
Intenté también agregar un entityStream.flush(); after entityStream.write (...) para forzar una escritura real en socket en lugar de simplemente escribir en el búfer. Mismo resultado :-( – AgostinoX
ok, gran respuesta, funciona de ambas maneras, es decir, con oyentes y con un proveedor de archivos personalizado. Tal vez debería enfatizarse que la solución es la segunda parte, tal vez moviéndola a la cima. El proveedor es interesante como una alternativa para los oyentes. Además, ayuda a aclarar la arquitectura jersey, por lo que la mantendría, pero no como una respuesta directa a la pregunta. – AgostinoX