Nur eine laufende Applikation erlauben?

Status
Nicht offen für weitere Antworten.
M

manuel k

Gast
Hallo!


Ich möchte überprüfen ob meine Java Applikation auf dem Server bereits läuft. Ist dies der Fall soll ein weiteres Ausführen des Programms nicht möglich sein.

Der Hintergrund ist der, dass das Programm per Windows Autostart ausgeführt wird, und ich diverse Remotedesktop zugänge habe. Jedesmal wenn nun ein anderer Remotedesktop Benutzer angemeldet wird, so startet auch das Programm ein 2tes mal.

Ich habe bereits bei manchen Java to .exe Tools die Option "Nur eine laufende Instanz erlauben" gesehen. Allerdings möchte ich den selben Effekt mit .jar Dateien erreichen.



Thx 4 help!


manuel k.
 
T

tuxedo

Gast
Mit ein wenig suchen im Forum hättest du die eine oder andere Lösungsstrategie gefunden.

Die Idee die ich ganz schick fand war, einen Dummy-Socketserver zusammen mit der Anwendung zu starten. Direkt vor dem Programmstarte und vor öffnen des Socketservers wir deinfach gecheckt ob dieser Port schon von einem anderen Socketserver belegt wurde.

Wenn die Anwendung zum ersten mal gestartet wird, ist der Port (hoffentlich) nicht belegt und der Socketserver kann starten.

Startet man die Anwendung ein zweites mal, wird festgestellt dass der Port schon belegt ist. Folglich muss bereits eine Instanz des Programms laufen.

Nachteil: Du müsstest sicher gehen dass der Port des Dummy Socket-Servers von keiner anderen Anwendung die auf dem PC installiert ist genutzt wird.


Weitere Details bietet dir die Suchfunktion.

- Alex
 
M

manuel k

Gast
Ja die Idee funktioniert grundsätzlich, aber dieser Fall ist nicht mein Ziel.

Es ist ja grundsätzlich möglich im System nachzufragen ob ein Programm schon läuft oder nicht.. zumindest mit c-Programmen.

Somit wollte ich wissen ob dies auch in Java auf diese Art und Weise möglich ist.
Die Lösung über einen Socket Server ist ja grundsätzlich nur ein Provisorium.

Ich habe ja schon halb Google nach Lösungen durchsucht, aber nur eine brauchbare Lösung (allerdings für ein C-Programm) gefunden, und mittlerweile gehen mir die Such-Schlagwörter aus...
 
T

tuxedo

Gast
Du willst also "allgemein" wissen welches Java-Programm gerade läuft?

Hmm... Ich weiß momentan nur, dass Java, wenn alles richtig eingestellt ist (was bei 2pc's nicht der fall war), in einem Verzeichnis namens "hsperfdata_<Rechnerloginname>" die PIDs gespeichert werden. Mittels JConsole oder einer JMS-Anwendung kannst du da drauf zugreifen. Musst du mal im Netz googeln.

Ach ja: Das hsperfdata_<Rechnerloginname> Verzeichnis liegt im TMP Verzeichnis das via Umgebungsvariable definiert ist.

- Alex
 
T

tuxedo

Gast
manuel k hat gesagt.:
Ja die Idee funktioniert grundsätzlich, aber dieser Fall ist nicht mein Ziel.

ich darf dich doch nochmal zitieren?

Ich möchte überprüfen ob meine Java Applikation auf dem Server bereits läuft. Ist dies der Fall soll ein weiteres Ausführen des Programms nicht möglich sein.

...

Ich habe bereits bei manchen Java to .exe Tools die Option "Nur eine laufende Instanz erlauben" gesehen. Allerdings möchte ich den selben Effekt mit .jar Dateien erreichen.

Na dann ist doch die Socketserver-Lösung eine praktikable und einfache Alternative, oder etwa nicht? Mit JMS wird das ganze glaub ich wesentlich aufwendiger und komplexer.

Von Java aus das Betriebssystem fragen "Läuft gerade eine Java Anwendungs namens XYZ" geht IMHO nicht. Wenn, dann musst du, wie bereits erwähntm Java, oder besser die eigene Anwendung (via Socket) selbst fragen.
Oder deine Anwendung erstellt selbst eine PID File im User-Home... Wege gibts genug.

- Alex
 
G

Guest

Gast
alex0801 hat gesagt.:
Hmm... Ich weiß momentan nur, dass Java, wenn alles richtig eingestellt ist (was bei 2pc's nicht der fall war), in einem Verzeichnis namens "hsperfdata_<Rechnerloginname>" die PIDs gespeichert werden. Mittels JConsole oder einer JMS-Anwendung kannst du da drauf zugreifen.

- Alex

Das ist schon mal sehr Interessant!
Java bietet also offensichtlich keine vordefinierten Methoden die beim start eines Programms überprüfen, ob dieses bereits läuft.

Ich denke ich hab jetzt eine Idee wie ich das Ganze recht simpl realisieren kann.
Werde das ganze dann Posten wenn ich was brauchbares Programmiert habe.


Schönen Dank für die Lösungsvorschläge!
 
G

Guest

Gast
OK habe jetzt eine relativ einfache und gut funktionierende Lösung gefunden:
Dabei wird beim ersten Programmstart eine Datei unter beliebigem Pfad erstellt, und bei Programmende (auch im Falle eines Programmabbruchs durch eine Exception) wieder gelöscht.
Existiert diese Datei beim Programmstart, wird dies durch eine bool'sche Variable angezeigt, und es steht dem Benutzer frei, sein Programm nun beim Start zu beenden, oder zumindest eine Warnung anzuzeigen.

Hier ser Source:

Code:
package exec;

import java.io.File;
import java.io.IOException;

public class CheckRunningInstance {
	
	private String path;
	private String prefix = "sysID";
	private String suffix = ".prf";
	private boolean isSingleInstance = false;
	
	File AppIdentifier;
	
	public CheckRunningInstance(String path, String prefix, String suffix){
		this.path = path;
		this.prefix = prefix;
		this.suffix = suffix;
	}
		
	public boolean isSiungleInstance()
	{
		return this.isSingleInstance;
	}
	public void findIdentFile()
	{
		AppIdentifier = new File(path+"/"+prefix+suffix);
		
		try {
			if(!AppIdentifier.createNewFile()){
				System.out.println("Program already started");
				isSingleInstance = true;

			}
			else{
				AppIdentifier.deleteOnExit();
			}
			
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}
}



L-ectron-X hat diesen Beitrag am 01.11.2007 um 12:21 editiert.
Code-Tags eingefügt.
 

L-ectron-X

Gesperrter Benutzer
Wenn deine Kiste abschmiert, wird nichts mehr gelöscht und dein Programm wird bei einem Neustart des Systems demzufolge auch nicht mehr gestartet...
Also keine so gute Idee. Hättest du dir mal die Mühe gemacht, das Forum zu durchsuchen, wärst du auch auf dieses Problem gestoßen, denn das wurde ausführlich diskutiert.

Hier gibts jede Menge bereits besprochene Möglichkeiten mit Quellcode-Beispielen: http://www.java-forum.org/de/viewtopic.php?t=55421
 
T

tuxedo

Gast
BTW: Unter Linux läufts genauso... Wenn mir ein Dienst abschmiert und die PID File nicht gelöscht wird kann sein dass ich vor dme nächsten Start des Programm diese File erst löschen muss.

Aber okay, Linux ist auch ein bisschen ne andere Welt. Würde sich aber in Windows mit einer einfachen Abfrage "Sicher dass keine weitere Instanz läuft?" lösen lassen. Kommt halt auf den Anwendungsfall drauf an, soll heißen: "Wie idiotensicher mus die Anwendung sein?!"

Ohne jetzt das Forum nach der anderen Diskussion abgesucht zu haben: Der Weg über die JVM eigene PID ist vielleicht etwas "sicherer". Sollte AFAIK auch mit nem Systemcrash zurecht kommen.

- Alex

[update]

Vielleicht ist auch das hier hilfreich:
http://java.sun.com/javase/6/docs/technotes/tools/share/jps.html
http://www.galileocomputing.de/open...26_005.htm#mj88051fab899ff9a6b0c4d01570a3ff51
 

L-ectron-X

Gesperrter Benutzer
alex0801 hat gesagt.:
Würde sich aber in Windows mit einer einfachen Abfrage "Sicher dass keine weitere Instanz läuft?"
Das ist ein Hebel an der falschen Stelle...
Warum sollte man damit das Konzept wieder aufweichen?
 
T

tuxedo

Gast
Ich sag ja: Kommt auf den Anwendungsbereich an... Ist sicherlich nicht überall die "brauchbare" oder "beste" Lösung ...
 

thE_29

Top Contributor
Es gibt diese Callback zeugs unter Windows!

http://jeans.studentenweb.org/java/trayicon/trayicon.html#download

Dieses TrayIcon bietet diese Möglichkeiten!

Hab das so gemacht

Code:
     String appName = "MeinAppName";
     long result = WindowsTrayIcon.sendWindowsMessage(appName, 1234);
     if (result != -1)
     {
         // If window exists, there's already an instance of our app running
         // Print message and exit (other app will restore its window when receiving
         // our message - see WindowsMessageCallback
         System.out.println("[Already running other instance of " + appName +
                            " (returns: " + result + ")].");
         return false;
     }
else
{
     // Init the Tray Icon library given the name for the hidden window
     WindowsTrayIcon.initTrayIcon(appName );
     WindowsTrayIcon.setWindowsMessageCallback(new WindowsMessageCallback());
}

Dann die Klasse WindowsMessageCallback

Code:
public class WindowsMessageCallback implements TrayIconCallback
{
   public int callback(int param)
   {
       // Param contains the integer value send with sendWindowsMessage(appName,param)
       System.out.println("[Other instance started (parameter: "+param+")].");
       // Return integer value to other process
       return 4321;
   }
}

Wahrscheinlich gibts das ganze auch in einer Lib ohne TrayIcon, aber ich weiß es halt das es so auch geht!

Aber um Plattformunabhängig zu bleiben (wenn das gewünscht ist) würde ich die Port Variante empfehlen! Also mit udp lauschen ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
B Wie erstelle ich dazu eine Abfrage ob der Button gedrückt wurde? Allgemeine Java-Themen 8
J Integration pay Pale in eine JavaFx Desktop Application Allgemeine Java-Themen 1
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
8u3631984 Strukturiertes Logging : Jedes Feld in eine seperate Zeile - aber wie ? Allgemeine Java-Themen 2
berserkerdq2 Gibt es eine saubere Dokumentation von Jfoenix? Allgemeine Java-Themen 1
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
T Eine Frage des Designs Allgemeine Java-Themen 2
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
H Eine Linie verkürzen Allgemeine Java-Themen 5
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
berserkerdq2 Wie mache ich in IJVM eine if verzweigung? Allgemeine Java-Themen 27
F Gibt es mittlerweile eine Alternative zu DaisyDiff Allgemeine Java-Themen 2
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
pizza_dox_9999 Wie füge ich eine "eigene" ScriptEngine dem ScriptEngineManager? Allgemeine Java-Themen 3
F Kennt ihr eine Library um 2 HTML Seiten zu diffen? Allgemeine Java-Themen 8
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
OnDemand Anzeigen was eine Applikation macht Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
Tobero Wie kann man eine Poisson Disc Sampler? Allgemeine Java-Themen 7
M Openjdk - gibt es auch eine Openjre? Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
N Arrayliste in eine Datei speichern Allgemeine Java-Themen 4
J Öffnen eine jar-Datei Allgemeine Java-Themen 11
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
S Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..? Allgemeine Java-Themen 7
S Habt ihr eine Idee wie man Serializierung testen kann..? Allgemeine Java-Themen 6
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Drachenbauer warum bekomme ich hier eine NullPointerException Allgemeine Java-Themen 6
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
N Eine stelle der Fibonacci-Zahlenfolge ausgeben. Allgemeine Java-Themen 4
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
W Collections Suche etwas Sorted-List-Artiges...hat jemand eine Idee? Allgemeine Java-Themen 13
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
I Eine Anwendung so gut wie möglich beschützen Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
M Login in eine Webseite mit Java Allgemeine Java-Themen 3
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
M Schlüsselworte Was ist eine Java Spezifikation + JSR? Allgemeine Java-Themen 11
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
E RMI FWH: RMI- Wie erstelle ich stubs dynamisch, bzw. unterdrücke eine Statisch-Warnung? Allgemeine Java-Themen 0
J Eine bestimmte Zahl im Integer ändern Allgemeine Java-Themen 9
Q-bert Strings aus der JList in eine Datenbank speichern Allgemeine Java-Themen 1
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
S Korrekte Pfadangaben damit eine .jar Datei unter Windwos läuft. Allgemeine Java-Themen 24
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
R bei eclipse von java in eine andere programmiersprache wechseln? Allgemeine Java-Themen 2
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
C Eclipse einstellen, dass eine bestimmte JDK benutzt werden soll Allgemeine Java-Themen 3
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
A Best Practice Java - eine Art Plugin-Struktur Allgemeine Java-Themen 3
S wie rufe ich mit .jar datei eine .bat auf? Allgemeine Java-Themen 15
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
J Mehrere Wörter getrennt in eine Array einlesen, wie ? Allgemeine Java-Themen 7
E Methoden Hat jemand eine gute Lösung? Allgemeine Java-Themen 5
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
Exdroid BlueJ Wie bekomme ich die Ausgabe in eine TXT Datei? Allgemeine Java-Themen 2
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
Tausendsassa Interface Eine Gui von einer anderen schließen lassen Allgemeine Java-Themen 3
S Threads Kann mir jemand helfen eine parallele Hilfsklasse zu implementieren..? Allgemeine Java-Themen 3
S Best Practice Brauche eine Idee für eine Java Projekt! Allgemeine Java-Themen 11
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
M Eine Datei im Speicher erneut laden(?) Allgemeine Java-Themen 1
V Gibt es eine Möglichkeit die Internet auslastung mit Java auszulesen Allgemeine Java-Themen 11
L Drop Emails von Outlook in eine JList Allgemeine Java-Themen 5
P Wie funktioniert das Feedback eines Klicks auf eine Java GUI Allgemeine Java-Themen 10
P Dezimalzahl in eine Binärzahl umrechnen Allgemeine Java-Themen 12
M Eine static-Methode verlassen Allgemeine Java-Themen 2
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben