WatchDog Thread und Listener

serjoscha

Mitglied
Hallo zusammen

Ich habe mir für ein aktuelles Programm eine WatchDog Klasse geschrieben, welche in einem Thread für
die Dauer ihrer Laufzeit eine Datei auf Änderungen überwacht.

Ich habe mir damals schonmal sowas geschrieben und habe einen PropertyChangeListener verwendet
um die Controller Klasse mitbekommen zu lassen, dass der WatchDog eine Änderung an der Datei
festgestellt hat, jedoch finde ich das mit dem PropertyChangeListener nicht sonderlich elegant und
versuche jetzt schon mehrere Stunden eine "schöne" Lösung zu finden um den Controller vom
WatchDog Thread aus benachrichtigen zu können.

Kann mir da jemand eine Lösung zu nennen ?

Ich möchte wirklich nur ungern dass die WatchDog Klasse selber die entsprechenden Aktionen ausführt.
Sie soll wirklich nur bei Änderungen benachrichtigen und nicht auch noch irgendwas machen (außer
benachrichtigen) wenn was passiert.


Danke!
 
T

tuxedo

Gast
Was hält dich davon ab ein eigenes Listener-Interface zu definieren? Der Watchdog-Thread kann dann Listener-Implementierungen entgegen nehmen und diese entsprechend "benachrichtigen".
 

serjoscha

Mitglied
hm, um ganze ehrlich zu sein weiß ich nicht wie das funktioniert. Mir hat sich auch immernochnicht
die Funktion von Interfaces eröffnet, da Interfaces ja garkeine ausprogrammierte Funktionalität haben
sondern nur beschreiben wie eine Klasse die davon erbt auszusehen hat.

Das hieße ich habe:

Controller Klasse
WatchDog Klasse
WatchDogEventListener

[..]

Controller Klasse implements WatchDogEventListener
Watchdog implements/extends (?!) WatchDogEventListener?

Hmmm, "problem" ist hier dass die WatchDog Klasse schon Thread extendet, wobei sich das ja zur Not
sogar noch mit implements runnable lösen ließe

hmm...
 
T

tuxedo

Gast
Der Watchdog muss nix implementieren.

Er muss nur Methoden haben wie:

Java:
addListener(WatchdogEventListener listener) { ... }
removeListener(WatchdogEventListener listener) { ... }

Das Listener interface könnte so aussehen:
Java:
public interface WatchdogEventListener {

public void eventOccured(File f);

}

Die "listener" die du da bekommst, steckst du in eine Liste. Tritt ein Event auf, so nimmst du die Liste her, holst dir jeden einzelnen Listeneintrag (also den Listener) her, und rufst da drauf

Java:
listener.eventOccured(theFileThatHasBeenChanged);

auf.

Dein Controller implementiert dieses Interface. D.h. du musst die Methode "eventOccured" dort implementieren.

Und um sich für ein Event anzumelden, rufst du dann

Java:
myWatchdog.addListener(myController);

auf. Fertig.
 
Zuletzt bearbeitet von einem Moderator:

serjoscha

Mitglied
Danke für die tolle darlegung!

Folgendes versteh ich aber nicht:
Die "listener" die du da bekommst, steckst du in eine Liste. Tritt ein Event auf, so nimmst du die Liste her, holst dir jeden einzelnen Listeneintrag (also den Listener) her, und rufst da drauf

Java:
listener.eventOccured(theFileThatHasBeenChanged);
auf.

Ich habe das grade mal versucht umzusetzen: irgendwie wir nun direkt beim initialisieren des Programms
die EventOccured methode aufgerufen. Wie kann ich definieren, was dieses event triggert?! Das geht mir
nicht in den Sinn.

Ich habe praktisch jetzt gemacht was du mir beschrieben hast:

Meine WatchDog Klasse hat nun eine add-Methode um über den Controller den Listener hinzufügen zu können,
ich habe ein Interface mit dem Occured Event und ich habe meinen Controller, welcher das Interface
implementiert und im Moment einfach nur eine kleine Nachricht ausgibt...

Bitte um Aufklärung meiner Verwirrung ???:L

Danke!
 
T

tuxedo

Gast
Die addListener() Methode fügt den Listener nur in die Liste mit Listenern hinzu. Da wird noch kein "eventOccured" aufgerufen.

So. Dein Watchdog bekommt ja irgendwie mit wenn sich die zu überwachende Datei geändert hat. Hat er so eine Situation entdeckt, dann iteriert der Watchdog über die Liste mit listenern, und ruft auf jedem einzelnen Listener in der Liste "eventOccured" auf.

Ergo: Deine aktuelle kleine testnachricht wird nur dann ausgegeben, wenn sich die zu überwachende Datei geändert hat.

- Alex
 

serjoscha

Mitglied
wunderbar, es hat funktioniert!!

ganz großes danke!!!

super gute Erklärung!!

Eine kleine Sache verstehe ich noch nicht ganz, wieso brauche ich eine Liste von Listenern,
wenn ich nur einen einzelnen Listener habe? Lässt sich das der Verständlichkeit des Quellcodes
halbes auch anders lösen? Also ohne Liste?

Ich habe dafür nun eine Array Liste vom Typen Meines ListenerInterfaces genommen, ist das so auch
gängig / sauber?

Danke!!!!!!!
 
T

tuxedo

Gast
Naja, i.d.R. gibts mehrere die sich für so ein Event interessieren könnten.

Wenn du ausschließen kannst dass sich mehrere dafür interessieren, dann kannst du dir die Liste sparen.

Bei verwendung der Liste musst du halt auch drauf achten, dass du das hinzufügen und entfernen und das "drüber iterieren" synchronisierst. Ohne Liste sparst du dir das natürlich ebenfalls.

Ein "Array" benutze ich hier eigentlich nicht. Denn ich weiß ja nicht wieviele Listener kommen. Umkopieren ist auch unschön. Verwende eigentlich ausschließlich so was:

Java:
List<MyListenerInterface> listeners = new ArrayList<MyListenerInterface>();

Das ist quasi das "bessere Array" in dem Fall.
 

diggaa1984

Top Contributor
nun mal die Frage .. was ist der Unterschied zur Nutzung vom PropertychangeSupport .. auch dazu musst du listener anmelden, allerdings sparst du dir das selbstständige benachrichtigen der listener, und du musst keine Liste extra verwalten, das macht der Supporter für dich.

das einzige was mich stören würde wäre, diesen Supporter zweckzuentfremden, wenn man keine Properties im eigentlichen Sinne hätte ... aber Listener-Geschichten kann man damit doch einfach umsetzen
 

serjoscha

Mitglied
naja wie du schon sagtest: das zweckentfremden stört mich. Außerdem die Tatsache, dass ich
mir extra dafür eine Variable hätte anlegen müssen. Da ist es so doch wirklich schon ne Nummer sauberer.
Und ganz davon ab: Listener selber schreiben zu können ist wohl eine sache die recht wichtig ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thallius WatchDog Allgemeine Java-Themen 25
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
smarterToby Wie stoppe ich diesen Thread Allgemeine Java-Themen 4
A Thread.sleep Problem Allgemeine Java-Themen 2
J Thread started nur einmal Allgemeine Java-Themen 19
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand Logfile pro User / Thread Allgemeine Java-Themen 7
OnDemand Thread / Service abbrechen Allgemeine Java-Themen 3
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
B Thread.sleep() in EJB Container wie lösen? Allgemeine Java-Themen 11
S Ist das Neuzuweisen von Feldern atomic und damit Thread-Safe? Allgemeine Java-Themen 2
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
Flynn Thread-Problem... Allgemeine Java-Themen 2
G Thread-Programmierung Allgemeine Java-Themen 5
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
G Beendet sich der Thread selbst?! Allgemeine Java-Themen 3
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
S Thread beenden Allgemeine Java-Themen 9
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
Aruetiise Swing JOptionPane ohne denn Thread zu pausieren Allgemeine Java-Themen 1
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
T Merkwürdiges Thread-Verhalten Allgemeine Java-Themen 6
K Thread Problem Allgemeine Java-Themen 6
W Thread sleep 30 sekunden - wenn keine Antwort bis dahin neu senden Allgemeine Java-Themen 2
H Thread bleibt stehen bei jar in jar Allgemeine Java-Themen 1
J Threads HTTP Request (Thread) dauert lange - in Android Allgemeine Java-Themen 3
F CPU Last eines Thread ausfindig machen Allgemeine Java-Themen 0
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
P Threads BufferedImage, Thread Concurrency Allgemeine Java-Themen 1
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
llabusch Thread blockiert Dialog Allgemeine Java-Themen 1
J Thread wait() Allgemeine Java-Themen 2
V Thread.sleep und InterruptedException? Allgemeine Java-Themen 1
G Thread nicht von GC zerstört Allgemeine Java-Themen 6
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
Sogomn Thread blocken bis Taste gedrückt Allgemeine Java-Themen 5
T Starten vom Thread Allgemeine Java-Themen 3
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
Q Thread wacht nicht auf Allgemeine Java-Themen 7
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
T Threads Input/Output im Thread - Datei ohne Inhalt Allgemeine Java-Themen 1
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
U Thread beenden Allgemeine Java-Themen 3
W Threads Mit Thread und Runtime externe Programme öffnen Allgemeine Java-Themen 0
N Thread interrupt Status debuggen Allgemeine Java-Themen 6
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
E Threads linkedlist/multi-thread problem Allgemeine Java-Themen 3
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
A Thread Fehler absichtlich provozieren Allgemeine Java-Themen 3
B Threads Java Thread kommunizieren Allgemeine Java-Themen 12
N Thread Sicherheit im komplexen Datenmodell Allgemeine Java-Themen 7
K Thread richtig benutzen Allgemeine Java-Themen 3
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
vandread Problem bei kleiner Thread-Übung Allgemeine Java-Themen 2
G Thread erzeugt nicht plausible NullPointerException Allgemeine Java-Themen 7
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
P [Thread] Scheint nicht Sequenziell zu Arbeiten Allgemeine Java-Themen 9
A eine test thread.join() frage Allgemeine Java-Themen 2
tuttle64 Verständnisprobleme mit Thread Locks Allgemeine Java-Themen 4
G Threads Thread bei Datenabfrage Allgemeine Java-Themen 3
S Thread anhalten per Button ? Allgemeine Java-Themen 3
E Thread Programmierung Allgemeine Java-Themen 2
S Threads ServerSocket-Thread soll schlafen, bis er gebraucht wird Allgemeine Java-Themen 2
V Thread schneller stoppen Allgemeine Java-Themen 2
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
B Mausbewegung im Thread erkennen (hoch/runter) Allgemeine Java-Themen 6
G Linux/C++/Pthreads auf JVM zugreifen, thread safe? Allgemeine Java-Themen 10
K Threads Probleme mit Thread Allgemeine Java-Themen 13
K Threads Thread überprüfen Allgemeine Java-Themen 3
Z Threads Thread für einen Client Allgemeine Java-Themen 9
M Thread JavaFish Allgemeine Java-Themen 10
G Thread.sleep Allgemeine Java-Themen 12
M Threads Viele Aufrufe aus Thread, komisches Verhalten Allgemeine Java-Themen 8
B Threads Main Thread warten auf abgebrochen Task warten lassen Allgemeine Java-Themen 25
K Timer Thread Allgemeine Java-Themen 8
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
C Mehothode in anderenm Thread aufrufen Allgemeine Java-Themen 10
R Thread läuft nicht?! Allgemeine Java-Themen 7
R ThreadPool - vorhandene thread liste überprüfen bzw. aufräumen Allgemeine Java-Themen 3
J Anderem Thread Variable mitgeben Allgemeine Java-Themen 2
C Argument an einen Thread übergeben Allgemeine Java-Themen 4
S java.util.ConcurrentModificationException - aber nur ein Thread Allgemeine Java-Themen 3
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
P Java Probleme - java.lang.Thread.run(Unkown Source) Allgemeine Java-Themen 10
L Im Thread auf Eingaben warten Allgemeine Java-Themen 3
P aus Thread auf Form zugreifen Allgemeine Java-Themen 9
C Threads Thread blockieren Allgemeine Java-Themen 4
K Threads Thread für Sleep Allgemeine Java-Themen 6
H Threads Thread stirbt aber Objekte in ihm leben weiter?! Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben