Timeout funktion zu einer Eventlogabfrage

garstig

Mitglied
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.

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.
 

garstig

Mitglied
Kann mir wirklich niemand helfen? Oder irgendwelche hilfreichen Links posten? Ich hab zwar schon Dr. Google gefragt aber ich würd hier nicht Double posts schreiben wenn ich was gutes gefunden hätte.
 

garstig

Mitglied
So. Bin auf die Lösung draufgekommen, durch langwieriges rumexperimentieren, sodass ich gemerkt habe, dass das EventLog Parsing, welches mit der JNA Bibliothek mitgeliefert wird, bei einer Loganzahl von über 13000 (Application z.B) 25 sekunden braucht um ein relevantes Log rauszusuchen und mir das OK zu geben. Mit der funktionierenden Timeout-Funktion wäre das ein wenig hirnrissig und generell ineffizient. Ich nehme an, dass dieser mitgelieferte EventLogIterator auch die Möglichkeit hat vom neusten zum ältesten Log zu laufen, aber das ist für meine Anforderungen an das Programm. nicht das richtige.

Eine funktionierende Möglichkeit wäre in Java den Microsoft-eigenen Log Parser anzustoßen, welches mit einer wunderbaren Filterung durch SQL Abfragen die relevanten Logs in eine .txt Files (andere Outputs auch möglich) speichert die man im Programm ganz einfach auslesen kann.

So und jetzt zum Timeout: Es lässt sich der EventParser in einen Thread packen. Der sieht in etwa so aus.
Java:
public class EvtParserThread extends Thread{
 boolean finished = false;
 public void run() {
  while(!finished){
    Process process = new ProcessBuilder("%Pfad zu%LogParser.exe","SELECT *  INTO '%Destination%myrepooort.txt' FROM Application").start();
    //myrepoooort.txt auslesen. 
  }
 }

 public void finishThread(){
		this.finished = true;
		
	}
}

In der aufrufenden Klasse wird dieser Thread gestartet und ein TimerTask erstellt das so aussieht:

Java:
public class TimerTaskLulu extends java.util.TimerTask {
	EvtParserThread thread;
	public TimerTaskLulu(EvtParserThread thread){
		this.thread = thread;
	}
	@Override
	public void run() {
		if(thread.finish){
			cancel();
		}
		else{
			thread.finishThread();
		}
	}

}

Es wird dann zeitgleich die run() Methode des Parsers aufgerufen und der TimerTask mit der gewünschten Zeit gescheduled. .schedule(TimerTask, sec*1000).

Was mich verwundert hat: das Programm konnte nach erfolgreichem Timeout oder erfolgreichen Event finden nicht terminieren. Ich habe dann in der aufrufenden Klasse
Code:
thread.interrupt();
timer.cancel();
eingefügt, dann hat alles funktioniert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Webservice timeout bei Ausführung der .jar Allgemeine Java-Themen 3
M iMacros/Timeout Allgemeine Java-Themen 0
N Timeout setzen Allgemeine Java-Themen 10
R Socket verbindung mit Timeout Allgemeine Java-Themen 2
S Thread nach Timeout beenden Allgemeine Java-Themen 2
K Runtime.exec mit Timeout Allgemeine Java-Themen 5
J url-Service timeout einrichten? Allgemeine Java-Themen 10
P Nicht terminierende Methoden abfangen - timeout ? Allgemeine Java-Themen 3
0 Timeout für Thread setzen? Allgemeine Java-Themen 2
M Servlet --> Berechnung --> Timeout vom Proxy oder IE!? Allgemeine Java-Themen 7
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
S Validation Annotation Funktionsparameter vs Funktion vs Attribut Allgemeine Java-Themen 0
R Variablen String mit split-Funktion aufteilen Allgemeine Java-Themen 7
A Serialize - Add Funktion Allgemeine Java-Themen 1
B Discord Bot - Funktion wird nicht aufgerufen Allgemeine Java-Themen 1
A Variablen Funktion übergibt den Wert nicht Allgemeine Java-Themen 13
J Überschriebene Funktion soll nicht die super Funktion aufrufen Allgemeine Java-Themen 4
Aruetiise Funktion(y = mx+n) in String speichern und berechnen Allgemeine Java-Themen 9
B Hilfe!! spiel um Funktion des Selektierens erweitern (mit ASCII-Tabelle) Allgemeine Java-Themen 3
MiMa ArrayList Rückgabewerte aus einer Funktion Allgemeine Java-Themen 15
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
A Plot funktion applet Allgemeine Java-Themen 4
S Methoden "Unschöne" Break-Anweisung aus verschachtelter Funktion entfernen Allgemeine Java-Themen 11
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
T Best Practice MD5 Funktion Allgemeine Java-Themen 9
perlenfischer1984 Testng : Funktion mit mehreren Parametern testen Allgemeine Java-Themen 5
L Stack overflow bei einer endrekursiven Funktion (Anwendung: Spezialform des Package Merge) Allgemeine Java-Themen 4
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
O JNA Zugriff auf Funktion aus DLL Allgemeine Java-Themen 0
Lord.Djerun (Taschenrechner) jButtons mit gleicher Funktion zusammenfassen Allgemeine Java-Themen 6
I Javafx Open/Read und Tree Funktion Allgemeine Java-Themen 14
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
F Classpath als Argument in Funktion übergeben Allgemeine Java-Themen 3
H SHA256 update-Funktion Allgemeine Java-Themen 3
J Methoden Abgeänderte Fibonacci Funktion Allgemeine Java-Themen 2
G Polymorphie Funktion als Parameter Allgemeine Java-Themen 8
F Funktion nur in einem Zeitraum Allgemeine Java-Themen 5
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
M Anzahl der Durchläufe einer Funktion errechnen Allgemeine Java-Themen 6
J Autofill Funktion Uhrzeit Allgemeine Java-Themen 19
M Funktion gesucht: Text vektorisieren Allgemeine Java-Themen 20
K Warum wartet diese Funktion auf beenden des Threads? Allgemeine Java-Themen 3
N JNI Callback Funktion Allgemeine Java-Themen 8
D Problem bei der Darstellung einer trigonometrischen Funktion Allgemeine Java-Themen 2
E Funktion sperren bis Unterfunktionen ferig sind Allgemeine Java-Themen 3
D Referenz einer Funktion aus einer anonymen Klasse? Allgemeine Java-Themen 3
J Funktion zu einer Uhrzeit/datum ausführen Allgemeine Java-Themen 4
S eigene Update Funktion Allgemeine Java-Themen 5
Ark Name für Funktion gesucht Allgemeine Java-Themen 5
Screen Eine mathematische Funktion als Argument für eine Methode - Matheparser? Allgemeine Java-Themen 21
Daniel_L Bug in Copy-Funktion bei HTML-Editorpane? Allgemeine Java-Themen 4
multiholle Aufrufer einer Funktion ermitteln Allgemeine Java-Themen 13
W JMF- Player.getDuration() Funktion spinnt Allgemeine Java-Themen 2
C JTextComponent - mit Schlagwörter Funktion aufrufen Allgemeine Java-Themen 2
SuperSeppel13 php-funktion aufrufen Allgemeine Java-Themen 5
M get Funktion von Vector Allgemeine Java-Themen 4
V Wie Enum an Funktion "übergeben" ? Allgemeine Java-Themen 4
G Webserver Funktion Allgemeine Java-Themen 3
S Random funktion in einer Grafischen Oberfläche Allgemeine Java-Themen 10
C Funktion stoppt alles Allgemeine Java-Themen 7
G Funktion aus array aufrufen Allgemeine Java-Themen 16
P Funktion vorhanden - wie auf Transitivität erweitern? Allgemeine Java-Themen 6
N Funktion als Parameter einer anderen Funktion Allgemeine Java-Themen 5
lumo Row Header ist public, zeigt die funktion aber nicht public Allgemeine Java-Themen 8
P Unterschied zwischen Funktion und Methoden Allgemeine Java-Themen 3
B E-Funktion mit Java Allgemeine Java-Themen 9
S verstehe diese Funktion nicht Allgemeine Java-Themen 6
S Referenz auf Funktion? Allgemeine Java-Themen 16
K Funktion unabhängig vom Namen aufrufen Allgemeine Java-Themen 5
F Vorteile -> Funktion Allgemeine Java-Themen 2
P gegenstück zur php funktion gzinflate()? Allgemeine Java-Themen 3
D Problem bei Aufruf einer Funktion Allgemeine Java-Themen 3
J Welche Daten für Ative-X Funktion? Allgemeine Java-Themen 5
X Replay Funktion realisieren? Allgemeine Java-Themen 5
J Funktion alle Möglichkeiten berücksichtigen Allgemeine Java-Themen 5
P DLL Funktion benutzen Allgemeine Java-Themen 3
S Fortran Funktion mit JNI aufrufen: java.lang.UnsatisfiedLink Allgemeine Java-Themen 2
T Pipe-Funktion - Prozente falsch? Allgemeine Java-Themen 8
A undo funktion in Malprogramm Allgemeine Java-Themen 15
J Method.invoke -> Exceptions der Funktion abfangen Allgemeine Java-Themen 5
M Frage zu resume funktion bei downloadmanager Allgemeine Java-Themen 7
M Funktion liest nach Textaus aus der vorigen Zeile Allgemeine Java-Themen 2
G nichtabstrakte Funktion zu einer Interface hinzufügen Allgemeine Java-Themen 6
M Funktion des JRE Allgemeine Java-Themen 8
B Nach Deserialisieren: Elemente des JFrames ohne Funktion Allgemeine Java-Themen 5
A funktion schiffeZeichnen zwei mal aufrufen Allgemeine Java-Themen 16
P Suche String Tutorial zu Suche&Ersetze Funktion von text Allgemeine Java-Themen 35
D Mathematische Funktion grafisch in Java darstellen Allgemeine Java-Themen 2
7 Gibts in Java ne Funktion, die ein ganzes Array ausgibt Allgemeine Java-Themen 11
L sin cos funktion Allgemeine Java-Themen 5
L return-Funktion Allgemeine Java-Themen 5
L return Funktion Allgemeine Java-Themen 6
M Funktion als Parameter oder andere Möglichkeit Allgemeine Java-Themen 3
H Funktion aus einer anderen Klasse ausführen Allgemeine Java-Themen 3
TRunKX Gibt es ne fertige Java Funktion die Dateien vergleicht? Allgemeine Java-Themen 4
M Funktion wird nicht durchlaufen. Allgemeine Java-Themen 13
G Bilder zeichnen und Zoom Funktion Allgemeine Java-Themen 2
G java funktion in JSP file aufrufen. Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben