# doppeltes Starten verhindern



## Tharsonius (22. Mrz 2010)

Hallo zusammen,

ich habe ein Problem, ich möchte verhindern, dass mein Programm 2 mal gestartet wird. Dummerweise habe ich derzeit keine Idee wie ich das machen kann.

Ich habe mir bereits überlegt, ob ich eine Datei ablege und beim beenden wieder lösche, aber wenn mein Programm aus welchen Gründen auch immer nicht sauber beendet, dann wird unter Umständen die Datei nicht entfernt.

Ich denke man müsste die laufenden Tasks abfragen und nach dem eigenen Programm durchsuchen und wenn schon eine Instanz läuft, dann gleich wieder beenden. Nur habe ich keine Ahnung wie ich das machen kann.

Oder hat jemand irgend eine andere Idee wie man das Problem lösen kann? Bietet Java da vielleicht sogar einen Mechanismus für, den ich derzeit nicht kenne?

Bin für Ideen dankbar.


----------



## eRaaaa (22. Mrz 2010)

Java Blog Buch : D) Java-Anwendung nur einmal ausführen


----------



## nrg (22. Mrz 2010)

also ich habe das immer mit File (Java Platform SE 6) gemacht. Spricht da irgendwas dagegen? Weil in deinem Beispiel ist das ja anders gelöst.

edit: ok zitat API: "this method should not be used for file-locking, as the resulting protocol cannot be made to work reliably" hört sich schonmal nicht so gut an . aber warum? also ich hatte damit nie Probleme (ausser ich hab die VM in der IDE abgeschossen).


----------



## eRaaaa (22. Mrz 2010)

Naja, es reicht ja aber schon wenn es ein klein bisschen unzuverlässig ist, wiel du dann eben deine Applikation nicht mehr starten kannst, bevor du manuell die Datei gelöscht hast...



> Deletion will be attempted only for normal termination of the virtual machine, as defined by the Java Language Specification.



ich weiß jetzt zwar selbst auch nicht was unter "normal" bzw "unnormal" fällt, aber kann mir ein Stromausfall / Absturz des OS oder eben so einen kill wie du ihn ansprichst schon als "unnormal" vorstellen.


----------



## FArt (22. Mrz 2010)

Es gibt Kombinationen von Portbelegungen und File-Locks mit Hearbeat Google hilft da weiter... bestimmt auch die Forensuche... ich glaube mich daran erinnern zu können, dass hier mal eine fertige Lösung gepostet wurde...


----------



## L-ectron-X (22. Mrz 2010)

Es gab mal einen alten Thread, du meinst wahrscheinlich diesen:
http://www.java-forum.org/allgemeine-java-themen/34662-verhindern-programm-mehrmals-geoeffnet.html

Ansonsten im Java-Blog-Buch.


----------



## Tomate_Salat (22. Mrz 2010)

ich hatte mir das Thema auch mal so angeschaut und die Seiten sind mir auch bekannt (ich hoffe zumindest sie noch richtig im Kopf zu haben ). 

Eine Möglichkeit wärde doch sicher noch: Einen Stream auf eine Datei öffnen und einfach nicht mehr schließen. In der Theorie kann ja kein anderes Programm dann mehr auf die Datei zugreifen => Das führt zur Exception => das führt zu einer Meldung gefolgt von System.exit. 

Ist gerade so eine spontan-idee von mir :-/


----------



## FArt (22. Mrz 2010)

Tomate_Salat hat gesagt.:


> i
> Eine Möglichkeit wärde doch sicher noch: Einen Stream auf eine Datei öffnen und einfach nicht mehr schließen. In der Theorie kann ja kein anderes Programm dann mehr auf die Datei zugreifen => Das führt zur Exception => das führt zu einer Meldung gefolgt von System.exit.
> 
> Ist gerade so eine spontan-idee von mir :-/



Tipp: klappt nicht. Begründung(en): weiß ich, sag ich aber nicht ;-)


----------



## Janus (22. Mrz 2010)

Wie wäre denn die revolutionäre Idee, dem Anwender einfach zu erlauben, dein Programm so oft zu starten, wie er es lustig findet?


----------



## Illuvatar (22. Mrz 2010)

Janus hat gesagt.:


> Wie wäre denn die revolutionäre Idee, dem Anwender einfach zu erlauben, dein Programm so oft zu starten, wie er es lustig findet?



Beispiel: Wenn mein Browser offen ist und ich starte ihn nochmal, geht ein neuer Tab auf. Und das finde ich gut


----------



## Tharsonius (23. Mrz 2010)

Janus hat gesagt.:


> Wie wäre denn die revolutionäre Idee, dem Anwender einfach zu erlauben, dein Programm so oft zu starten, wie er es lustig findet?



Ursprünglich wollte ich ein mehrfaches Starten nicht verhindern, leider hat sich aber herausgestellt, dass das mit der HSQL Datenbank Probleme gibt.

Bei meinem Programm handelt es sich um einen Turnierplaner und die Daten der Spieler, Teams, des Turniers und der einzelnen Runden werden in der Datenbank abgelegt. Beim Systemstart wird die Verbindung zur Datenbank aufgebaut bzw. eine angelegt, wenn keine da ist, beim Beenden wird die Datenbank wieder geschlossen.

Und leider hat die HSQL Datenbank ein Problem damit, wenn ich 2 mal öffne und dann 2 mal schließe. Das resultiert in einer Zerstörung der Daten, dummerweise. Daher tüftle ich zum einen derzeit an einem Backup System, möchte zu bestimmten Zeiten ein Backup anlegen (ist auch kein Problem, nur der Zeitpunkt ist noch unklar  ). Zum anderen möchte ich aber doppeltes öffnen unterbinden und daher dachte ich daran, einfach doppelten Programmstart zu unterbinden.

Programm startet also, prüft ob es das erste ist, wenn nicht, Nutzer darauf hinweisen und beenden, wenn doch, dann normal arbeiten.


----------



## tme (23. Mrz 2010)

nrg hat gesagt.:


> edit: ok zitat API: "this method should not be used for file-locking, as the resulting protocol cannot be made to work reliably" hört sich schonmal nicht so gut an . aber warum? also ich hatte damit nie Probleme (ausser ich hab die VM in der IDE abgeschossen).



Dateisystemsemaphorik läßt sich nicht sauber auf jedes Dateisystem abbilden. NFS beispielsweise wird scherzhaft auch als "Nightmare File System" bezeichnet, weil das Locking (und die Zugriffssicherheit) mehr schlecht als recht funktionieren.

Dein Programm kennt jedoch das zugrundeliegende Dateisystem nicht oder wertet dies nicht aus, so dass du dich auf ein Feature verläßt, was nicht zwangsläufig jedes Dateisystem hat (exklusiver Zugriff).


----------



## The_S (23. Mrz 2010)

Leute, wenn ihr Tipps gebt, lest doch bitte auch das schon gepostete und wiederholt nicht alles doppelt und dreifach  . Was noch nicht gesagt wurde, über FileChannel funktioniert das auch.

Das mit der HSQLDB ist komisch. Du setzt sie aber schon als Server ein!?


----------



## Tharsonius (23. Mrz 2010)

The_S hat gesagt.:


> Das mit der HSQLDB ist komisch. Du setzt sie aber schon als Server ein!?



Ich verwende den In-Process (Standalone) Mode.
Das heisst ich starte die Datenbank nicht extra als Server sondern starte die aus meinem Programm.

Außer meinem Programm muss auch kein anderes darauf zugreifen.

Ich muss gestehen, ich habe bisher auch keine Probleme gehabt, nur ab und an ärgert das halt etwas, wenn ich versehentlich 2 Instanzen meines Programms starte. Das kann nun aber auch an Eclipse liegen, weiss ja nicht in wieweit das da noch zwischen funkt...


----------



## The_S (23. Mrz 2010)

Ohne Server kann nur immer eine Anwendung darauf zugreifen, hast du ja schon selbst (richtig) gesagt.


----------

