Hola a todos.
Estoy desarrollando una aplicación Vaadin 8.4.2 con Spring, con dashboard, el cual muestra una serie de datos que se recuperan de unas llamadas a WEBs.
Unos de esos WS tarda bastante (unos 4 minutos), por lo que he pensado en crear Threads que llamen a los distintos WS y cuando se reciban los datos se vayan pintando en el Dashboard.
Para ello en la clase UI he puesto es @Push (@Push y @Push(value = PushMode.MANUAL, transport = Transport.WEBSOCKET) )
Y en la vista que muestra los datos:
@Override
public void enter(ViewChangeEvent event) {
UI.getCurrent().accessSynchronously(new Runnable() {
@Override
public void run(){
getPedidosStatus();
UI.getCurrent().push();
}
});
UI.getCurrent().accessSynchronously(new Runnable() {
@Override
public void run() {
getHomologaciones();
UI.getCurrent().push();
}
});
UI.getCurrent().accessSynchronously(new Runnable(){
@Override
public void run(){
getRFQ();
UI.getCurrent().push();
}
});
UI.getCurrent().accessSynchronously(new Thread(){
@Override
public void run(){
getSubastas();
UI.getCurrent().push();
}
});
UI.getCurrent().accessSynchronously(new Runnable(){
@Override
public void run(){
getPedidosOnTime();
UI.getCurrent().push();
}
});
UI.getCurrent().accessSynchronously(new Runnable(){
@Override
public void run(){
getUserData();
UI.getCurrent().push();
}
});
}
Sindo las llamadas a los WS y actualización del UI lo que hay en el run (por ejemplo):
protected void getRFQ() {
try {
hlRFQ.setVisible(false);
rfq = talend.getRFQ();
if(rfq.isOK()) {
lbRCerrado.setValue(traductor.getTranslation("lbClosed")+": "+rfq.getCerradas()+" ");
lbRPendiente.setValue(traductor.getTranslation("pending")+": "+rfq.getPendientes()+" ");
lbREnEspera.setValue(traductor.getTranslation("awaiting")+": "+rfq.getEnespera()+" ");
lbRTotal.setValue(traductor.getTranslation("totalrfq")+": "+rfq.getTotal()+" ");
hlRFQ.setVisible(true);
}else {
lbInfoRFQ.setValue(traductor.getTranslation("E014"));
hlRFQ.setVisible(false);
GeneralUtils.showErrorNotification(traductor.getTranslation("E014")+" (E014)");
rfqError = true;
}
}catch(Exception e) {
GeneralUtils.showErrorNotification(traductor.getTranslation("E014")+" (E014)");
rfqError = true;
lbInfoRFQ.setValue(traductor.getTranslation("E014"));
hlRFQ.setVisible(false);
}
UI.getCurrent().markAsDirtyRecursive();
}
El problema que tengo es que no se muestra la página hasta que no se han terminado de llamar a todos los métodos que están dentro del run() (aunque seguro que se han lanzado en paralelo porque en depuración veo que si que se hace).
¿Alguien sabe que puede estar pasando?, ¿estoy puniendo el código mal? (He probado tanto con Runnable como con Thread…)
Un saludo