Hallo,
ich habe eine Frage zum Ablauf meines Programms. Und zwar will ich beim Programmstart eine .exe ausführen. Diese .exe schreibt in den Win Eventlog, den ich dann regelmäßig abfragen will, je nach dem ob die .exe einen Fehler hatte oder alles fertig abgearbeitet hat (unterscheidung nach ID, nicht so relevant). Jetzt kommt der tricky part: ich möchte für den Fall, dass die .exe keine Logs reinschreibt, ein timeout haben.
Also jetzt nochmal von vorn, die Eventlogabfrage bekommt ein gewisses Maß an Zeit in der es nach neuen Eventlogs abfragen darf und soll automatisch terminieren, wenn timeout. Wenn aber in dieser Zeitspanne das oder die entsprechenden Logs kommen kann er froh und munter weiter arbeiten.
Wie mache ich das? Ich habe schon lange vorher rumprobiert und überlegt ob ich die Abfrage als Timertask implementieren soll, aber ich weiß nicht so recht wie ich das angehen soll. Derzeit sieht mein Code so aus.
Das ist die Klasse die das .exe starten soll (derweil notepad.exe) und einen dummy event schreibt den ich zu testzwecken in der folgenden Klasse abfragen wollte. Was ich bemerkt habe ist, mein programm macht irgendwie nicht weiter bis ich notepad geschlossen habe. Gibts da so ein silent oder irgendwas?
Das mit dem Eventlogtype soll noch auf Event ID abfrage geändert werden. Bei Fragen oder Verbesserungsvorschläge zum sonstigen Code bitte fragen und vorschlagen, mein Problem ist einzig und allein diese Timer geschichte, der Rest sollte irrelevant sein und ist nur vollständigkeits halber hier gepostet.
ich habe eine Frage zum Ablauf meines Programms. Und zwar will ich beim Programmstart eine .exe ausführen. Diese .exe schreibt in den Win Eventlog, den ich dann regelmäßig abfragen will, je nach dem ob die .exe einen Fehler hatte oder alles fertig abgearbeitet hat (unterscheidung nach ID, nicht so relevant). Jetzt kommt der tricky part: ich möchte für den Fall, dass die .exe keine Logs reinschreibt, ein timeout haben.
Also jetzt nochmal von vorn, die Eventlogabfrage bekommt ein gewisses Maß an Zeit in der es nach neuen Eventlogs abfragen darf und soll automatisch terminieren, wenn timeout. Wenn aber in dieser Zeitspanne das oder die entsprechenden Logs kommen kann er froh und munter weiter arbeiten.
Wie mache ich das? Ich habe schon lange vorher rumprobiert und überlegt ob ich die Abfrage als Timertask implementieren soll, aber ich weiß nicht so recht wie ich das angehen soll. Derzeit sieht mein Code so aus.
Java:
public class FileCopy {
Kunde k;
String path;
public FileCopy(Kunde k){
this.k = k;
this.path = PropertyCon.getProps("fileCopyExe");
copy();
eventreader();
}
/**
* Führt den Prozess FileCopy aus.
*/
public void copy(){
MsgLog.write("Starting Filecopy for "+k.getName());
try {
//Eventuell mit systemShell.exec(path+" "+k.getName()) ausführen
//@SuppressWarnings("unused")
//Process process = new ProcessBuilder(path,"-"+k.getName()).start();
Runtime systemShell = Runtime.getRuntime();
systemShell.exec(path/*+" "+k.getName()*/);
@SuppressWarnings("unused")
Process output = systemShell.exec(
"eventcreate /ID 1 /L APPLICATION /SO JAVAEVENT /T INFORMATION /D "+k.getName()+"\" MY FIRST JAVA EVENT\"");
} catch (IOException e) {
MsgLog.write("Couldn't execute Filecopy for "+k.getName());
//sendMail
e.printStackTrace();
MsgLog.flush();
}
return;
}
/**
* Führt die Klasse EventLogReader aus und wartet auf den boolean Wert "true".
*/
public void eventreader(){
EventLogReader reader = new EventLogReader(k);
boolean success = reader.read();
if(success){
k.setStatus(4, true);
MsgLog.write("FileCopy done for "+k.getName());
return;
}
}
}
Das ist die Klasse die das .exe starten soll (derweil notepad.exe) und einen dummy event schreibt den ich zu testzwecken in der folgenden Klasse abfragen wollte. Was ich bemerkt habe ist, mein programm macht irgendwie nicht weiter bis ich notepad geschlossen habe. Gibts da so ein silent oder irgendwas?
Java:
public class EventLogReader {
Kunde k;
EventLogIterator log = new EventLogIterator("Application");
int pointer;
EventLogRecord record;
int maxTime;
DbConnector table = new DbConnector();
public EventLogReader(Kunde k) {
this.k = k;
maxTime = table.getMaxCopyTime(this.k);
pointer = table.getPointer();
}
/**
* Geht für eine bestimmte Zeit den Eventlog ab einem Pointer n durch bis
* zum aktuellsten Log und überprüft ob der Log von FileCopy kommt, wenn ja,
* dann wird der Typ und die Description(Kundenspezifisch) analysiert.
*
* @return Boolean true if and only if LogType equals "Informational" and
* Description contains CRMID. False if Error or Timeout
*/
public boolean read() {
long endTimeMillis = System.currentTimeMillis() + (maxTime * 1000);
String comment = "";
do {
this.record = log.next();
if (record.getStrings() != null) {
String[] comments = record.getStrings();
if (record.getRecordNumber() > pointer) {
if (record.getSource().equals("FileCopy")) {
for (int i = 0; i < comments.length; i++) {
comment.concat(comments[i] + "/n");
}
if (comment.contains(k.getId())) {
if (record.getType().equals("Error")) {
// send Mail
k.setStatus(301, true);
MsgLog.write("Filecopy failed for "+k.getName());
return false;
} else if (record.getType().equals("Informational")) {
MsgLog.write("Filecopy done for "+k.getName());
return true;
}
} else {
continue;
// send Mail with Comment,Time and Type in Message
}
}
if (!log.hasNext()) {
pointer = record.getRecordNumber();
table.updateLogPointer(pointer);
}
} else {
continue;
}
}
} while (log.hasNext() || System.currentTimeMillis() <= endTimeMillis);
// send Mail
k.setStatus(302, true);
MsgLog.write("FileCopy timed out for "+k.getName());
return false;
}
}
Das mit dem Eventlogtype soll noch auf Event ID abfrage geändert werden. Bei Fragen oder Verbesserungsvorschläge zum sonstigen Code bitte fragen und vorschlagen, mein Problem ist einzig und allein diese Timer geschichte, der Rest sollte irrelevant sein und ist nur vollständigkeits halber hier gepostet.