Hallo,
mein Programm nutzt eine embeddet Database auf die nur einmal zugeriffen werden darf. Startet man das Programm also zwei mal kommt es zu Fehlern. Um dies abzufangen möchte ich dafür sorgen, das das Programm nur einmal gestartet werden kann und sonst ein Fehler kommt.
Ich habe mich in das Thema schon etwas eingelesen. Die eigentliche Sperrung erfolgt über eine Lock-Datei die ich beim Start erstelle und am Ende wieder lösche. Das Programm prüft die Existenz der Datei. Existiert sie wird ein Fehler ausgegeben, existiert Sie nicht wird sie angelegt und das Programm gestartet.
Dieses System funktioniert jetzt schon super. Natürlich kommt es zu Problemen, falls das Programm apstürzt. Denn dann wird meistens die Lock-Datei nicht gelöscht und das Programm funktioiert erst wieder beim manuellen löschen der Datei.
Somit will ich neben der Datei noch einen Sockel blegen. Hier kommt es zu einigen Probleme. Folgende Szenarien können auftreten
Szenario 1: Port und Datei existieren nicht
Programm ist noch nicht gestartet, normaler Programmstart möglich
Szenario 2: Port und Datei existieren:
Programm läuft schon. Start blockieren
Szenario 3
ort existiert nicht, Datei existiert
Das letzte Programmende war ein Absturz und die Datei konnte so nicht beendet werden. Datei wird gelöscht und dann ein normaler Programmstart durchgeführt
Szenario 4: Port existiert aber, Datei nicht
Ein andres Programm nutzt temporär / oder dauerhaft (kann ich ja nicht wissen) diesen Port. Das Programm nutzt ab sofort einen anderen Sperr-Port und startet dann das Programm ( schon mit dem neuen Port) normal
Hinweis zu den Ports: Der Sperr-Port ist in einer config-Datei gespeichert und wird dort aus gelesen oder neu geschrieben. Ich nutze den bereich der Dynamic Ports: 49152–65535 (für den Change). Der von mir gewählte Startport in der config ist 50000.
Mein Problem ist nun mein Programm den Port iwie nicht erkennt bzw. als gesperrt oder frei erkennt. Wenn die datei durch Absturz noch vorhanden ist sagt er das Programm wird schon ausgeführt. Er erkennt nicht das der Port frei ist. Wie man unten im Code sehen kann arbeite ich mit 2 booleschen variablen. Ich dachte mir wenn ein Port schon blockiert ist führt das zu einer Exception und im catch-bereich kann ich dann den Variablenwert ändern aber das schein nicht zu funktionieren. Alles andere (Datei-Sperrung, Port lesen und ändern funktioniert super).
Ich hoffe einer hat bis hier hin gelesen und guckt sich nun noch den Code an. Das Problem bedurfte leider etwas erklärung
Gruß
Cromm Cruach
mein Programm nutzt eine embeddet Database auf die nur einmal zugeriffen werden darf. Startet man das Programm also zwei mal kommt es zu Fehlern. Um dies abzufangen möchte ich dafür sorgen, das das Programm nur einmal gestartet werden kann und sonst ein Fehler kommt.
Ich habe mich in das Thema schon etwas eingelesen. Die eigentliche Sperrung erfolgt über eine Lock-Datei die ich beim Start erstelle und am Ende wieder lösche. Das Programm prüft die Existenz der Datei. Existiert sie wird ein Fehler ausgegeben, existiert Sie nicht wird sie angelegt und das Programm gestartet.
Dieses System funktioniert jetzt schon super. Natürlich kommt es zu Problemen, falls das Programm apstürzt. Denn dann wird meistens die Lock-Datei nicht gelöscht und das Programm funktioiert erst wieder beim manuellen löschen der Datei.
Somit will ich neben der Datei noch einen Sockel blegen. Hier kommt es zu einigen Probleme. Folgende Szenarien können auftreten
Szenario 1: Port und Datei existieren nicht
Programm ist noch nicht gestartet, normaler Programmstart möglich
Szenario 2: Port und Datei existieren:
Programm läuft schon. Start blockieren
Szenario 3
Das letzte Programmende war ein Absturz und die Datei konnte so nicht beendet werden. Datei wird gelöscht und dann ein normaler Programmstart durchgeführt
Szenario 4: Port existiert aber, Datei nicht
Ein andres Programm nutzt temporär / oder dauerhaft (kann ich ja nicht wissen) diesen Port. Das Programm nutzt ab sofort einen anderen Sperr-Port und startet dann das Programm ( schon mit dem neuen Port) normal
Hinweis zu den Ports: Der Sperr-Port ist in einer config-Datei gespeichert und wird dort aus gelesen oder neu geschrieben. Ich nutze den bereich der Dynamic Ports: 49152–65535 (für den Change). Der von mir gewählte Startport in der config ist 50000.
Mein Problem ist nun mein Programm den Port iwie nicht erkennt bzw. als gesperrt oder frei erkennt. Wenn die datei durch Absturz noch vorhanden ist sagt er das Programm wird schon ausgeführt. Er erkennt nicht das der Port frei ist. Wie man unten im Code sehen kann arbeite ich mit 2 booleschen variablen. Ich dachte mir wenn ein Port schon blockiert ist führt das zu einer Exception und im catch-bereich kann ich dann den Variablenwert ändern aber das schein nicht zu funktionieren. Alles andere (Datei-Sperrung, Port lesen und ändern funktioniert super).
Ich hoffe einer hat bis hier hin gelesen und guckt sich nun noch den Code an. Das Problem bedurfte leider etwas erklärung
Java:
public static void main(String[] args){
if(!isLocked()){
@SuppressWarnings("unused")
MainWindow m = new MainWindow();
lockSystem();
}else{
InfoForm error = new InfoForm(null, "Fehler", "Dieses Programm befindet sich schon in Ausführung. Ein zweiter Start ist nicht möglich");
error.buttonOk.removeAll();
error.buttonOk.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
}
public static void lockSystem(){
File lockFile = new File("sys.lock");
try {
lockFile.createNewFile();
int port = Integer.parseInt(getPort());
@SuppressWarnings({ "unused", "resource" })
ServerSocket lockSocket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}
public static boolean isLocked(){
boolean existFile = false;
boolean existPort = false;
File lockFile = new File("sys.lock");
if(lockFile.exists()){
existFile = true;
}
int port = Integer.parseInt(getPort());
try {
ServerSocket lockSocket = new ServerSocket(port);
lockSocket.close();
} catch (IOException e) {
existPort = true;
}
if(existFile && !existPort){
lockFile.delete();
return false;
}
if(!existFile && !existPort){
return false;
}
if(!existFile && existPort){
changePort();
return false;
}
return true;
}
public static void changePort(){
//Port ändern und in conifg schrebein
}
private static String getPort(){
//Port auslesen
}
}
Gruß
Cromm Cruach