Hi,
ich bastle gerade mit Futures rum und habe ein kleines Problem. Ich habe eine Page um eine Massenoperation durch zu führen, die gut und gerne mal Minuten lang läuft. Jetzt will ich den User nicht hängen lassen, also erstmal Sanduhr eingeblendet, bis die Operation durch ist. jetzt möchte ich dem User aber auch sagen, bei wie viel Prozent der Prozess gerade ist, und da kommt der Fehler.
Also der Handler sieht so aus:
Der MassenabbauWorker dann so:
Es knallt natürlich in der Schleife, wo ich wissen will, wie viel Prozent durch sind, weil ich auf den worker direkt zugreife und nicht auf das Future Objekt, aber das Future lässt mich ja nicht auf die Funktion zugreifen, oder?
Kann ich irgendwie schauen, wie weit das Future ist?
ich bastle gerade mit Futures rum und habe ein kleines Problem. Ich habe eine Page um eine Massenoperation durch zu führen, die gut und gerne mal Minuten lang läuft. Jetzt will ich den User nicht hängen lassen, also erstmal Sanduhr eingeblendet, bis die Operation durch ist. jetzt möchte ich dem User aber auch sagen, bei wie viel Prozent der Prozess gerade ist, und da kommt der Fehler.
Also der Handler sieht so aus:
Java:
@Named("massenabbauhandler")
@ViewScoped
public class MassenabbauHandler implements Serializable {
private static final long serialVersionUID = 1L;
private Integer inProgress = 0;
private Massenabbau massenabbau = new Massenabbau();
private List<String> abbauObjects = new ArrayList<>();
private String abbauStep = "Bitte laden Sie eine Datei hoch";
private boolean startBlocked = true;
private List<String> posCols = new ArrayList<>();
private boolean error = false;
@Inject private MassenabbauWorker worker;
public void startAbbau() throws InterruptedException, ExecutionException {
setInProgress(1);
worker.setMassenabbau(massenabbau);
Future<String> workerResult = worker.work();
while(!workerResult.isDone()) {
Thread.sleep(1000);
setInProgress(worker.getStatus());
}
setInProgress(100);
abbauStep = workerResult.get();
this.massenabbau = null;
FacesMessage.Severity severity = FacesMessage.SEVERITY_INFO;
String summary = "Abbau erfolgreich";
String detail = "Die Systeme wurden erfolgreich abgebaut";
if(abbauStep.contains("!!ERROR!!")) {
severity = FacesMessage.SEVERITY_ERROR;
summary = "Fehler beim Abbau";
detail = abbauStep.replace("!!ERROR!!", "");
abbauStep = "FEHLER " + detail;
error = true;
}
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(severity , summary, detail));
PrimeFaces.current().ajax().update("abbauForm:dataPanel");
}
}
Der MassenabbauWorker dann so:
Java:
@Stateless
public class MassenabbauWorker {
private static final Logger LOG = LogManager.getLogger(MassenabbauWorker.class);
private String object;
private List<Map<String,String>> hostList;
private String spalte;
private LocalDate abbauDatum;
private String ticketNo;
private double numHosts = 0d;
private double actHost = 0d;
@Inject private MassenabbauDbHandler dbHandler;
@Resource private ManagedExecutorService mes;
public void setMassenabbau(Massenabbau massenabbau) {
object = massenabbau.getAbbauObject();
hostList = massenabbau.getSheet().getTableSheetContent();
spalte = massenabbau.getHostCol();
abbauDatum = massenabbau.getAbbaudatum();
ticketNo = massenabbau.getTicket();
numHosts = hostList.size();
}
public Future<String> work() {
return mes.submit(() -> { return doAbbau();});
}
public String doAbbau() {
LocalDateTime start = LocalDateTime.now();
String ret = "";
try {
tu Zeug und zähl Zeilen
return "Abbau von " + hostList.size() + " Systemen abgeschlossen in " + durString;
} catch (Exception e) {
LOG.error("Fehler beim Abbau: ", e);
return "!!ERROR!!" + e.getMessage();
}
}
public Integer getStatus() {
Double prozent = (actHost / numHosts) * 100;
Integer rounded = Math.round(prozent.floatValue());
System.out.println("Status: " + actHost + "/" + numHosts + " sind Prozente: " + rounded);
return (rounded < 1 ? 1 : rounded);
}
}
Es knallt natürlich in der Schleife, wo ich wissen will, wie viel Prozent durch sind, weil ich auf den worker direkt zugreife und nicht auf das Future Objekt, aber das Future lässt mich ja nicht auf die Funktion zugreifen, oder?
Kann ich irgendwie schauen, wie weit das Future ist?