Best Practice Application extern nur einmal startbar

FXL

Mitglied
Guten Abend zusammen,

folgende Problemstellung:

Meine Anwendung soll wenn sie bereits läuft kein zweites mal gestartet werden können, sondern auf die aktuelle Programminstanz weiterleiten.

Hintegrund:
Meine Anwendung bekommt i.d.R. eine Datei übergebe (als Argument). Diese neue Datei soll in der aktuellen Instanz geladen werden.

Desweitern wäre es notwendig, zwischen Programmversionen zu unterscheiden. Also läuft Version 2014 - so kann Version 2013 als zweite Instanz gestartet werden.


Intersannt wäre für mich ersteinmal
- Wie kann ich feststellen ob meine Anwendung in der jvm läuft?
- Wie kann ich meiner Anwendung, nachdem die main-Funktion durchlaufen werden, nochmals eine Anweisung von außen mitgeben?
- Gibt es evtl. schon ein entsprechende API? 😉


Gruß
 
Zu Punkt 1 würde mir spontan die Lösung einfallen, dass man ...
  • ... einen Registry-Schlüssel beim Programmstart erstellt und bei Programmende löscht, daran kann man prüfen, ob es aktiv ist
  • ... eine Lock-Datei erstellt, also einfach eine Datei, die nach dem Programmende wieder gelöscht wird. Datei vorhanden -> Programm läuft
Mit beiden Methoden kann man auch die Versionsnummer der Instanz hinterlegen und in der zweiten Instanz dann checken, ob die Nummer übereinstimmt (Instanz nicht weiter ausführen) oder ob es sich um verschiedene Versionen handelt (Instanz weiterhin ausführen).

Punkt 2 verstehe ich nicht so wirklich. Wenn die main()-Methode durchlaufen wurde, ist das Programm ja i.d.R. beendet - außer man hat Daemon-Threads, was aber eher ein Ausnahmefall ist.
Wenn du meinst, dass die übergebene Datei an die "gültige" Instanz weitergegeben werden soll, würde mir spontan mal die Kommunikation über Pipes zwischen Prozessen einfallen. Ob und wie das genau in Java realisiert werden kann, weiß ich nicht, ist aber auf jeden Fall mal ein Google-Wort 🙂

Zu Punkt 3 kann ich leider nichts sagen, ich kenne keine derartigen APIs, habe mich damit aber auch noch nicht beschäftigt, daher heißt das nicht, dass es keine gibt.
 
Hi,

danke für deine Antwort.

Soweit kann ich folgen, das schwierigste wird wohl die "Kommunikation zwischen den Prozessen" sein.
Die Idee mit den Pipes oder Sockets finde ich gut.

Vielleicht fällt mit dem Thema auch der "Lock" weg - z.B.

-Anfrage an Server Socket schicken - Adresse pro Version unterschiedlich
-Keine Antwort--> keine Instanz läuft
-Antwort --> Anfrage schicken: Datei öffnen --> Programminstanz schließen

Gruß
 
ServerSockets wären zwar eine Möglichkeit aber für diesen Anwendungsfall meiner Meinung nach überdimensioniert. Was du suchst sind eher lokale Sockets (unter UNIX "Domain Socket"; unter Windows vermutlich unter ähnlichem Namen auffindbar) - also vorgegebene Sockets die meines Wissens nach über das Betriebssystem für die Inter-Process-Communication genutzt werden.
 

Neue Themen


Zurück
Oben