View Full Version : Restore Daten in java auswerten..
Hallo,
ich bin gerade dabei eine kleines Tool in Java zu schreiben welches ausgewählte save Files automatisch uploaded und diese auch per Knopfdruck restored. Das funktioniert soweit.
Nun möchte ich an mehr Informationen über den laufenden Vorgang des Restores haben, z.B wie viele Dateien/Daten wurden schon restored, würde denn ganzen restore zyklus gerne in einer JProgressBar anzeigen lassen, nur fehlen mir hierzu die benötigten Daten..
Hat jemand eine Idee?
Gruß
Das ganze wird schon etwas komplizierter.
Der RST gibt entsprechende Nachrichten im Joblog aus.
Wenn du also dein Kommando ausführst benötigst du nur noch die API's zum Auslesen des Joblogs.
Ggf. ist zu beachten, dass das Kommando nicht im selben Job wie dein Java gestartet wird (Threadsicherheit).
hmm ok , habe das nun mal versucht während der Restore läuft den JobLog in einem extra Thread auszulesen und auszugeben jedoch bekomme ich während des ganzen vorgangs immer die selben Nachrichten....
CPF1124 Job 210631/QUSER/QZRCSRVS started on 09/03/12 at 10:49:39 in subsystem QUSRWRK in QSYS. Job entered system on 09/03/12 at 10:49:39.
CPF1301 ACGDTA for 210631/QUSER/QZRCSRVS not journaled; reason 1.
CPIAD02 User **** from client x.x.x.91 connected to server.
CPC2196 Bibliothek QSYS2929 der Bibliotheksliste hinzugefügt.
CPF5C61 Client-Anforderung - Ausführen des Programms QGY/QGYOLJBL.
Soweit ich nun weiss bleibt der JobLog ja erhalten, und zum testen ersmal habe ich den JobLog am ende abgefragt und ausgegeben, jedoch bekomme ich kein detailliertes Ergebniss... im Moment frage ich den Job so ab:
JobLog myJobLog = new JobLog(MyAS400);
Enumeration e = myJobLog.getMessages();
while (e.hasMoreElements()) {
System.out.println(e.nextElement());
}
Ich sagte ja, dein RST-Befehl wird in einem eigenen Job durchgeführt!
Irgendwie musst du an diesen Job kommen und dessen Joblog auslesen.
Da ein Joblog genauso wie eine MSGQ aufgebaut ist, gibts da auch einen Key, ab dem man weiterlesen kann.
Die Javaklassen geben eigentlich alles was du brauchst:
CommandCall (http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzahh/javadoc/com/ibm/as400/access/CommandCall.html)
CommandCall (http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzahh/javadoc/com/ibm/as400/access/CommandCall.html#getServerJob)()
also sollte ich mit
command.run("DSPJOBLOG JOB("+ jobNummer + "/" + userID + "/" + jobName + ")");
command.getMessageList()
Alles auslesen können?
edit: ich glaube es liegt auch noch daran das ich meinen Restore primitiv über ein FTP command im Java ausführe. Das werde ich erstmal überarbeiten mit den passenden Methoden meines SaveFile Objektes... Dann solle es auch funktionieren..
Das ist soweit korrekt.
Allerdings läuft command.run nicht asynchron, so dass getMessageList erst nach Ende des Kommandos ein Ergebnis bringt.
Ggf. musst du eben vorher per getServerJob den Job ermitteln um dann auf das Joblog dieses Job's zuzugreifen.
Auch liefert getMessageList nicht alle Nachrichten. Du musst da vorher die Anzahl festlegen.
Da du aber asynchron die Nachrichten auslesen willst, musst du in einem anderen Thread auf dein Command-Objekt zugreifen.
Ob das threadsicher ist, musst du probieren.
k, klappt!
Vielen Dank für die Hilfe :)
hmm ok, der asynchrone Zugriff klappt doch nicht ganz so wie gewünscht...
Ich greife mit Hilfe eines anderen Threads auf das CommandCall Objekt zu und greife mir ein Job Object mit der Methode command.getServerJob();
Mit dem Job Object kann ich mir die Messages aus dem JobLog ziehen..
Jedoch spuckt er die Ergebnisse erst am Ende aus wenn der RST schon fertig ist...
<style type="text/css"> <!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } --> </style> // Thread A
command = new CommandCall(MyAS400);
com_Finish = command.run("RSTLIB SAVLIB(" + orginalLibName + ") DEV(*SAVF) SAVF(" + LibName + "/" + SaveFileName + ") MBROPT(*ALL)");
// Thread B
do {
Thread.sleep(2000);
Job myJob = command.getServerJob();
myJob.loadInformation();
System.out.println(myJob.getJobLog().getNumber());
JobLog myJobLog = new JobLog(MyAS400, myJob.getName(), myJob.getUser(), myJob.getNumber());
myJobLog.load();
Enumeration x = myJobLog.getMessages();
System.out.println("Job Status is.."+ myJob.getStatus());
while (x.hasMoreElements()) {
System.out.println(x.nextElement());
}
} while (com_Finish == false);
Anscheinend ist das Joblog erst nach Jobende verfügbar.
Ggf. gibt es noch andere Methoden, auf das Joblog eines aktiven Job's zuzugreifen.
Schau doch mal während der Ausführung nach, ob du den Job per WRKACTJOB/WRKUSRJOB findest und ob das Joblog da fortgeschrieben wird.