java-forum.org - Java programmieren aus Leidenschaft

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Sonstiges > Codeschnipsel u. Projekte

Codeschnipsel u. Projekte Ihr möchtet eure Projekte vorstellen, oder interessante, innovative Codefragmente diskutieren? Dann bitte hier!

Antwort
Themen-Optionen Thema durchsuchen Ansicht
Alt 18.06.2011, 21:47   #1 (permalink)
Stammbenutzer
Viertel Megabyte
 
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
Standard JSingleInstance - nur eine Instanz des Programms

Hey Leute,

ich habe mich mal dran gemacht, und eine Klasse geschrieben, mit der es einfach möglich ist nur eine Instanz eines Programmes zu haben. Schaut sie euch doch einfach mal an: https://bitbucket.org/mjdv/jsingleinstance/wiki/Home

Würde mich über Feedback jeglicher Art freuen, ich hoffe es ist alles selbsterklärend und die Dokumentation halbwegs verständlich
mjdv ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 19.06.2011, 01:21   #2 (permalink)
Java-Forum Team
Moderator
 
Registriert seit: 06.01.2007
Fachbeiträge: 16.993
Abgegebene Danke: 0
Erhielt 1.669 Danke für 1.512 Beiträge
Hmja, nach sowas wird öfter mal gefragt.

Könnte man die Notwendigkeit, "exit" aufzurufen, durch einen Shutdownhook umgehen?
Marco13 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 19.06.2011, 16:39   #3 (permalink)
Stammbenutzer
Viertel Megabyte
Themenstarter
 
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
Wenn du sowas meinst wie:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        System.out.println("Die VM wird gerade beendet!");
    }
})

Dann könnte ich das sicherlich noch einbauen

Kannte das vorher noch gar nicht

edit: implementiert, hat bei mir gefunzt. Und noch zwei bugs gefixt

Denke jetzt funktioniert das ganze schon ganz gut.

Geändert von mjdv (19.06.2011 um 17:22 Uhr)
mjdv ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 19.06.2011, 18:50   #4 (permalink)
Java-Forum Team
IRC-Operator (Java-Chat)
Moderator
 
Benutzerbild von Noctarius
 
Registriert seit: 17.08.2007
Fachbeiträge: 7.461
Abgegebene Danke: 70
Erhielt 566 Danke für 525 Beiträge
Nette Idee Werde ich mir die Tage mal genauer ansehen.
__________________
Lycia: Listener principle based XML Processor http://code.google.com/p/lycia
Apache Lightning: Fast Pojo-Serializer http://directmemory.apache.org/lightning
Apache DirectMemory: BigMemory like in-memory cache http://directmemory.apache.org
Noctarius ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 29.06.2011, 22:19   #5 (permalink)
Stammbenutzer
Viertel Megabyte
Themenstarter
 
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
@Noctarius, und shcon mal angesehen? Irgendwelche Tipps?

Ich hab nochmal ein paar Änderungen hinzugefügt. Die sendCommand() Methoder hat nun ein timeout von 5 sec. wenn nicht innerhalb von diesem timout ein OK von der beretis laufenenden Instanz kommt, wird false returned, und davon ausgegangen, dass die laufende Instanz abgestürzt ist und nur der Server Thread noch läuft.

Das timeout kann man via setTimeout(int secs) setzen. Man sollte also in der OnCommand() Methoder schnell das Kommando interpretieren und ausführen, und dann returnen, damit das timeout nicht überschritten wird. Das OK wird automatisch nach dem returnen gesendet.

Eine weitere Funktion ist forceExit(), hiermit kann man der anderen Instance sagen sich zu beenden, eben wenn diese abgestürzt zu sein scheint. JSingleInstance fürht dann einfach System.exit(-1) aus.

Meint ihr das macht so Sinn?

Als weiteres Feature ist geplant, dass man vll. einen JFrame übergeben kann, und man dann einfach diesen wieder in den Vordergrund holen kann via activateWindow(). Das spart einem, so ein Command immer selber implementieren zu müssen, was ja schon recht lästig sein kann.

edit: des weiteren wurde das Beispiel ein wenig verbessert
mjdv ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 29.06.2011, 22:43   #6 (permalink)
Java-Forum Team
Moderator
 
Registriert seit: 06.01.2007
Fachbeiträge: 16.993
Abgegebene Danke: 0
Erhielt 1.669 Danke für 1.512 Beiträge
Ich kann das gerade nicht ganz einordnen, aber kann es sein, dass man "Threads die eigentlich wegen eines abgestürzten Programmes tot sein sollten, aber dummerweise noch leben" durch ein
thread.setDaemon(true);
vor dem thread.start() verhindern könnte...?

EDIT: Äh nee... warte... kann sein dass das Unfug war... später nochmal überlegen
Marco13 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 30.06.2011, 09:09   #7 (permalink)
Stammbenutzer
Viertel Megabyte
Themenstarter
 
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
Naj, generell stimmt das schon. Aber der Server Thread wird sowieso beim beenden ducrch den shutdownHook abgewürgt. Es könnte höchstens noch ein Thread laufen, der die Clients handled. Vll. sollte man dort noch setDeamon(true) setzen.
mjdv ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 06.07.2011, 22:13   #8 (permalink)
Projektleiter RPGenesis
Team RPGenesis
 
Registriert seit: 03.05.2009
Fachbeiträge: 815
Abgegebene Danke: 10
Erhielt 96 Danke für 95 Beiträge
Hm, was mir als Verbesserungsvorschlag vielleicht noch einfallen würde: beseitige die Abhängigkeit von einer Datei. Derzeit müssen die Informationen über die Prozesskommunikation ja in einer Datei abgelegt werden, was unter Umständen ja nicht gewünscht sein könnte. Stattdessen wäre es vielleicht besser, JSingleInstance eine Art Initialisierungsobjekt zu übergeben, welches die Art der Kommunikation festlegt und sich um den Aufbau kümmert. Etwas, was in der Benutzung etwa in diese Richtung geht:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
// Initialisierung mit direkter Portangabe.
JSingleInstance instance = new JSingleInstance(new PortInitialiser("localhost", 9000));
// Initialisierung über Lockdatei (wie bisher).
JSingleInstance instance = new JSingleInstance(new FileInitialiser(System.getProperty("user.home") + ".myapp"));
// Oder etwas exotischer, Kommunikation über eine benannte Pipe (sofern möglich):
JSingleInstance instance = new JSingleInstance(new FifoInitialiser("myapp-fifo"));
__________________
Heut' debug ich
morgen browse ich
übermorgen caste ich
die Königin auf int!
Schilder-Duke

Geändert von Gastredner (06.07.2011 um 22:17 Uhr)
Gastredner ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 11.07.2011, 14:36   #9 (permalink)
Stammbenutzer
Viertel Megabyte
Themenstarter
 
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
Hi, sry das ich mich jetzt erst melde. Erstmal danke für dein Feedback

Stimmt, dass man vll. einen eigenen Port abgeben kann macht vll. Sinn. Aber ist es nicht einfacher, dafür einfach einen eigenen Konstruktor zu machen? Wenn nicht, wie sollte dann so ein Init Klasse aussehen?

Und das mit der Pipe verstehe ich nicht ganz, wie darf ich mir das denn vorstellen?
mjdv ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 11.07.2011, 19:41   #10 (permalink)
Projektleiter RPGenesis
Team RPGenesis
 
Registriert seit: 03.05.2009
Fachbeiträge: 815
Abgegebene Danke: 10
Erhielt 96 Danke für 95 Beiträge
Zitat: mjdv
Beitrag anzeigen
Stimmt, dass man vll. einen eigenen Port abgeben kann macht vll. Sinn. Aber ist es nicht einfacher, dafür einfach einen eigenen Konstruktor zu machen?
Im Prinzip wäre ein Konstruktor vielleicht einfacher, aber dieses Vorgehen hätte auch seine Nachteile:
  • Stell dir vor, später gäbe es, sagen wir einmal, 12 verschiedene Arten der Initialisierung - willst du wirklich 12 verschiedene Konstruktoren haben?
  • Es ist von jedermann erweiterbar. Nehmen wir mal an, jemand wollte eine Möglichkeit haben, über ein serielles Kabel mit einem anderem Rechner zu kommunizieren um sicherzustellen, dass dort das Programm nicht gleichzeitig läuft (wieso auch immer man dies tun sollte). Soll er dazu von deiner Hauptklasse erben und diese komplett umschreiben? Mit einem Initializer-Interface könnte er dies einfach selbst implementieren.
  • Es geht ja nicht nur darum, dass man den Port selbst angeben kann - der Initializer soll ja komplett festlegen, wie die Kommunikation mit anderen Instanzen abläuft. So könnte diese z. B. auch komplett ohne Datei ablaufen, was durch einen einfachen neuen Konstruktor schwerer zu erreichen wäre.

Zitat:
Wenn nicht, wie sollte dann so ein Init Klasse aussehen?
Ich hatte zur Demonstration mit einer Beispielimplementierung angefangen, aber dann merkte ich, dass ich fast schon alles hätte umschreiben müssen...ich denke, ich setze mich gleich nochmal dran.

Zitat:
Und das mit der Pipe verstehe ich nicht ganz, wie darf ich mir das denn vorstellen?
Das war nur ein mehr oder weniger aus der Luft gegriffenes Beispiel, aber ich denke, es könnte funktionieren. Eine benannte Pipe ist eigentlich nur eine normale Pipe, die man über einen Namen ansprechen kann. Wäre es nun möglich, aus Java heraus Zugriff auf diese Pipe zu erhalten, könnten verschiedene Instanzen über diese miteinander kommunizieren.
__________________
Heut' debug ich
morgen browse ich
übermorgen caste ich
die Königin auf int!
Schilder-Duke

Geändert von Illuvatar (11.07.2011 um 21:07 Uhr) Grund: List-Tags korrigiert
Gastredner ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 07.08.2011, 20:48   #11 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 11.06.2011
Fachbeiträge: 141
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Wird hier noch dran gearbeitet.
Ich kann mit den Beispielen in der Wiki etc, das ganze nicht zum laufen bringen.
CHAOSFISCH ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 07.08.2011, 21:16   #12 (permalink)
Stammbenutzer
Viertel Megabyte
Themenstarter
 
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
Hi CHAOSFISCH,

naja nicht wirklich mehr daran gearbeitet, da ich nicht weiß was man noch implementieren könnte, für meine Anwendungsfälle reicht es aus. Gastredner hat sich auch leider nicht mehr gemeldet

Wo genau liegt denn dein Problem?
mjdv ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 08.08.2011, 08:36   #13 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 11.06.2011
Fachbeiträge: 141
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Ja z.B steht dort:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
JSingleInstance instance = new JSingleInstance(System.getProperty("user.home") + ".myapp");
if(instance.isAlreadyRunning()) {
    System.out.println("is already running");
    instance.sendCommand("open: " + args[1]);
} else {
    instance.addCommandListener(new CommandListener() {
        @Override
        public void onCommand(final CommandEvent e) {
            if(e.command.startWith("open: ")) open(e.command.substring(0, "open: ".length);
        }
    });
}

Mal abgesehen das hier einige Fehler drinnen sind z.b. .length ohne () und eine weitere fehlende Klammer ) danach und ein s bei startsWith fehlt.
1. Woher nimmst du open() ?
2. Ich hab mein Beispiel so probiert:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
JSingleInstance instance = new JSingleInstance(System.getProperty("user.home") + ".myapp");
if(instance.isAlreadyRunning()) {
    System.out.println("is already running");
    instance.forceExit();
} else {
//Starte die Anwendung.
}

Heißt ich hab 2 Instanzen erstellt, die Meldung das die Anwendung bereits läuft kam, aber die Instanz wurde nicht beendet!?


Zudem bekomme ich immer 2 SocketExceptions
CHAOSFISCH ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 08.08.2011, 16:07   #14 (permalink)
Stammbenutzer
Viertel Megabyte
Themenstarter
 
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
Hi,

ja du hast recht, den wiki Text sollte ich nochmal überarbeiten. Die Idee des Beispiels ist, wenn du zB einen TextEditor hast, der schon läuft und jemand auf eine Text Datei klickt, sollte sich ja dein Editor öffnen. Wenn er jetzt schon läuft, wird an die laufende Instanz gesendet bitte öffne diese Datei, also die die als Argument in argv[1] mitgegeben wurde. open() ist dann natürlich eine Funktion in deiner Applikation die die Datei öffnet und in der Appliaktion anzeigt. open() ist natürlich nicht in dem Beispiel implementiert, es sollte nur eine möglich Demonstration sein.

Das mit forceExit() ist ein sehr peinlicher bug , den werde ich noch heute beheben // behoben

Aber wieso willst du die Applikation sofort beenden wenn sie läuft? Das macht doch keinen Sinn.

Ja die SocketExceptions kommen zB beim Beenden, da ich einfach den accept() Aufruf abwürge, aber das sollte nicht tragisch sein, die kannst du einfach ignorieren.

Geändert von mjdv (08.08.2011 um 16:41 Uhr)
mjdv ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 08.08.2011, 16:56   #15 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 11.06.2011
Fachbeiträge: 141
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Zitat: mjdv
Beitrag anzeigen
Hi,
Aber wieso willst du die Applikation sofort beenden wenn sie läuft? Das macht doch keinen Sinn.
Ich will dem User nen Dialog anzeigen, ihm sagen die Anwendung läuft bereits und ihn Fragen ob er die bereits laufende Anwendung (falls diese gecrasht ist) schließen möchte.

Ansonsten, sehe ich es richtig, dass du in der vom Programm erstellten Datei die PID speicherst?
CHAOSFISCH ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 08.08.2011, 17:11   #16 (permalink)
Stammbenutzer
Viertel Megabyte
Themenstarter
 
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
Achso, ja dann hast du das ja richtig gelöst (sofern du vorher noch den DIalog zeigst), war nur etwas verwirrt

Nein, es war zwar der Plan, die PID zu speichern, aber ich habe in Java keine Möglichkeit gefunden zu überprüfen ob ein Prozess mit einer bestimmten PID noch läuft. Aber das ist sowieso unnötig eigentlich, da wenn die Anwendung nicht mehr läuft, ich mich auch nicht zu dieser per Sockets verbinden kann.

Somit wird in der Datei nur der Port gespeichert auf dem nach Meldungen gehorcht wird.
mjdv ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 08.08.2011, 17:16   #17 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 11.06.2011
Fachbeiträge: 141
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Alles klar, werds dann nochmal testen.
CHAOSFISCH ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 09.08.2011, 14:52   #18 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 11.06.2011
Fachbeiträge: 141
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
So
Evtl. nochmal nen Bug gefunden:
Wenn die Datei schon existiert, weil sie nicht gelöscht wurde, dann gibts nen bug.
Dann kann man 2 Instanzen wieder starten. 2 mögliche Fehlerquellen:
Es wird überprüft ob eine Sockerverbindung aufgebaut werden kann -> Ja -> Verbindung wird beendet und es wird auf einen neuen Port connected der nicht abgespeichert wird.
1. Falscher connect port
2. Fehlender Dateizugriff

1 von beiden wird wohl nicht richtig sein.
CHAOSFISCH ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 09.08.2011, 21:23   #19 (permalink)
Stammbenutzer
Viertel Megabyte
Themenstarter
 
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
Hallo, danke für den Hinweis, werde ich mir mal ansehen.

Ist es bei dir vorgekommen, dass die Datei nicht gelöscht wurde?
mjdv ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 09.08.2011, 21:25   #20 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 11.06.2011
Fachbeiträge: 141
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Kann ich nicht genau sagen.
Es kann sein das die VM von außen beendet wurde und die Datei dadurch nicht gelöscht worden ist.
Auf alle Fälle: Wenn die Datei schon existiert funktioniert es nicht mehr, und dass ist dann meines achtens ein Bug :P
CHAOSFISCH ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Java Applet - Breakout Game Cloud1993 Spiele- und Multimedia-Programmierung 0 07.04.2011 09:18
(2D-Grafik) Vier gewinnt Problem Vancold Allgemeine Java-Themen 5 18.11.2010 11:28
Zeichnung verschwindet hinter Bild _fabi Java Basics - Anfänger-Themen 2 07.01.2009 02:14
nur eine Instanz eines Programms laufen lassen bubzilla Allgemeine Java-Themen 8 15.08.2005 16:49
Nur eine Instanz eines Programms zulassen, wie geht das? philo Allgemeine Java-Themen 15 20.08.2004 19:24


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de