# Nur eine Instanz eines Programms zulassen, wie geht das?



## philo (20. Aug 2004)

hallo,

wenn man innerhalb eines Java-Programms nur eine Instanz einer Klasse haben will, benutzt man ja das Singleton Pattern, aber wie kann ich beim Aufruf eines Programms sicherstellen, das nur ein  Programm läuft?

Gruss und Danke
philo


----------



## Beni (20. Aug 2004)

Du kannst eine Datei beim Start schreiben (oder locken), und diese Datei beim beenden wieder löschen (oder freigeben). wenn nun eine Datei existiert (oder gelockt ist), läuft schon ein Programm, und man bricht ab...


----------



## philo (20. Aug 2004)

nämlich wenn z.B. das Programme irgendwie unsanft beendet wird und dann die datei noch da ist. Der nächste aufruf des Programms würde abbrechen, da die Datei noch da ist.

gruss
philo


----------



## stev.glasow (20. Aug 2004)

Also ich mach das immer mit nem ServerSocket: beim programmstart verbinde ich einen Socket(Client) mit port xy.
Wenn dies gelingt übergebe ich erst dem ServerSocket evtl. nochein paar sachen (z.B.die Parameter die beim programm start übergeben worden sind, diese kann dann das bereits laufende Programm auswerten) und schließe dann das aktuelle Programm (das was zuletzt geöffnet wurde)
Und wenn die Verbindung fehltschlägt erstelle ich den ServerSocket und lasse das Programm laufen.
Bin mit dieser Lösung eigentlich ganz zufrieden, ob es da etwas besseres gibt weiß ich nicht.
- Hoffe das war einigermaßen Verständlich,
wenn nicht frage bitte noch mal nach.
[edit] achja es läuft natürlich alles über den localhost


----------



## philo (20. Aug 2004)

ah danke , also das erste programm baut den serversocket auf und verbindet sich mit ihm und meldet sich an und läuft. das nächste programm wird sich zum gleichen ServerSocket verbinden und da merkt der Server das schon was läuft. meldet das dem Programm  und dieses fährt sich dann runter. War das so gemeint?

Kann es da nicht Probleme mit einer Firewall geben und wirken Firewalls nicht auf Zugriffe von Localhost auf Localhost?

Und welchen Port benutzt du? Der muss ja frei sein und jedes muss den gleichen benutzen!

Was ist, wenn keine TCP/IP protokoll installiert ist (das wird doch verwendet oder?)

Gruss

philo


----------



## stev.glasow (20. Aug 2004)

erstmal das was ich nicht weiß: """Was ist, wenn keine TCP/IP protokoll installiert ist (das wird doch verwendet oder?) """

Und dann das andere:
Also, richtig verstanden hast du's. 
Und die firewall stört doch nicht weiter, dann muss der user der firewall eben sagen dass er diese verbinug erlauben soll, oder ist das mist?
Und ich verwende immer irgendeinen einen Port, am besten schön gross zb. 37862.
Oder(und) du bietest dem User an das er diesen Port in den erweitertten Einstellungen ändern kann.


----------



## akira (20. Aug 2004)

Hi,

also ich habe es nicht probiert, aber müßte es nicht reichen, eine System-Property zu setzen?
Also z.B:


```
String test = System.getProperty("myproperty","bla");
if(test!=null)
    System.setProperty("myproperty");
else {
    System.out.println("Nur eine Instanz erlaubt!");
    System.exit(0);
}
```


----------



## stev.glasow (20. Aug 2004)

Bleibt die nicht erhalten wenn das Programm beendet wird?


----------



## bygones (20. Aug 2004)

ne geht nicht !


----------



## stev.glasow (20. Aug 2004)

was jetzt?


----------



## bygones (20. Aug 2004)

stevg hat gesagt.:
			
		

> was jetzt?


akiras vorschlag


----------



## Grizzly (20. Aug 2004)

philo hat gesagt.:
			
		

> nämlich wenn z.B. das Programme irgendwie unsanft beendet wird und dann die datei noch da ist. Der nächste aufruf des Programms würde abbrechen, da die Datei noch da ist.
> 
> gruss
> philo



Also in meiner Firma haben wir das so gelöst:
Eine Datei wird beim Start des Programms erstellt und gesperrt. Wir die Anwendung beendet, wir die Datei entsperrt und gelöscht. Bevor die Datei beim Start jedoch erstellt wird, wird geschaut, ob sie schon existiert. Tut sie das, wird versucht eine Sperre auf die Datei zu setzen. Sollte dies klappen, wird dem Benutzer gesagt, dass die Anwendung das letzte Mal nicht richtig beendet wurde, er aber trotzdem jetzt damit arbeiten kann (rein theoretisch könnte man hier auch ein paar Integritätstests laufen lassen - meist wird ja aber eh eine Datenbank verwendet, die das dann selber macht). Kann die Sperre nicht gesetzt werden, wird eine Meldung ausgegeben, dass das Programm schon läuft. Nach dem Bestätigen der Meldung wird dann das Programm geschlossen.


----------



## philo (20. Aug 2004)

hallo,

hast du vielleicht mal bitte einen kleinen Tipp, wie man so ein datei sperrt und entsperrt?
habe gerade was von FileLock und FileChannel gesehen. Benutzt ihr das? Ich verstehe nicht wo man da die Datei angibt, die gesperrt werden soll.

danke erstmal, das hört sich gut an. das klappt auch auf jeder Platform?

philo


----------



## Grizzly (20. Aug 2004)

philo hat gesagt.:
			
		

> hallo,
> 
> hast du vielleicht mal bitte einen kleinen Tipp, wie man so ein datei sperrt und entsperrt?
> habe gerade was von FileLock und FileChannel gesehen. Benutzt ihr das? Ich verstehe nicht wo man da die Datei angibt, die gesperrt werden soll.



Du öffnest bspw. einen FileInputStream auf die Datei. Dann lässt Du Dir von dem FileInputStream per getChannel() den FileChannel geben. FileChannel besitzt zwei Methode tryLock(). Mit der einen sperrst Du die ganze Datei, mit der anderen nur einen bestimmten Ausschnitt. Als Rückgabewert bei einer erfolgreich gesetzten Sperre bekommst Du ein FileLock-Objekt. Mit der release() Methode des FileLock-Objektes entsperrst Du die Datei wieder.



			
				philo hat gesagt.:
			
		

> danke erstmal, das hört sich gut an. das klappt auch auf jeder Platform?
> 
> philo



Nein, nicht auf jeder. Nämlich nicht auf denen, die keine Dateisperre unterstützten. Java benutzt hier die Betriebssystem-Funktionen. Wobei mir spontan keine - zumindest aktuelle - Plattform einfällt, die das nicht implementiert hat.


----------



## Roar (20. Aug 2004)

kann mir jemand n link geben, wo erklärt wird was diese "Dateisperrung" überhaupt ist, macht und funktioniert? ich hab davon bisher auch nur in der Java API gehört :-/


----------



## Grizzly (20. Aug 2004)

Roar hat gesagt.:
			
		

> kann mir jemand n link geben, wo erklärt wird was diese "Dateisperrung" überhaupt ist, macht und funktioniert? ich hab davon bisher auch nur in der Java API gehört :-/


Du meinst ein Tutorial? Gute Frage ???:L . Habe bisher noch keines gesehen. Ich kenne das halt aus anderen Programmiersprachen. In C, Pascal und manchen Basic-Dialekten geht das (in anderen Programmiersprachen vielleicht auch, aber von denen weiss ich es halt  ).


----------

