Ho un client jersey che deve caricare un file abbastanza grande da richiedere una barra di avanzamento.
Il problema è che, per un caricamento che richiede alcuni minuti, vedo i byte trasferiti per andare al 100% non appena l'applicazione è stata avviata. Quindi sono necessari alcuni minuti per stampare la stringa "on finished".
È come se i byte fossero stati inviati a un buffer e stavo leggendo la velocità del transfert-to-the invece della velocità di upload effettiva. Ciò rende inutile il progresso.Jersey upload progress client
Questo è il codice molto semplice:
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);
Per ottenere lo stato di avanzamento Ho aggiunto un filtro ContainerListener, obviouslt prima builder.post chiamare:
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));
grazie Tomasz, questa risposta è molto buona. Il fatto che tu abbia fornito due modi per configurare il client è davvero ammirevole e esplicativo. sfortunatamente, il problema persiste. Ho appena messo un System.out.println (...) dopo entityStream.write, ma il risultato è che scrivo file grandi (> 10 MB) in una frazione di secondo, e poi si blocca mentre avviene il caricamento "reale".Il fatto che avvenga anche con questa soluzione significa che il problema è altrove. Per la tua risposta, non posso accettarlo ma posso iniziare un'altra domanda specifica in cui sarò lieto di contrassegnarlo come corretto. :-) – AgostinoX
Ho provato anche ad aggiungere un'entitàStream.flush(); after entityStream.write (...) per forzare una scrittura effettiva in socket invece di limitarsi a scrivere sul buffer. Stesso risultato :-( – AgostinoX
ok, ottima risposta, funziona in entrambi i modi, cioè con gli ascoltatori e con il fornitore di file personalizzato.Probabilmente si dovrebbe sottolineare che la soluzione è la seconda parte, forse spostandola in alto. Il fornitore è interessante come alternativa agli ascoltatori, inoltre aiuta a chiarire l'architettura della jersey, quindi la terrei, ma non come una risposta diretta alla domanda. – AgostinoX