Allgemeines


Wie kann ich das mehrmalige Starten meiner Java Anwendung verhindern?

Für diese Aufgabe gibt es verschiedene Ansätze. Mit dem Java SDK 1.4 und dem neuen Packet java.nio gibt es nunmehr auch die Möglichkeit eine Datei exklusiv zu "pachten". Für die Java SDK vor der Version 1.4 bietet sich jedoch insbesondere die nachfolgend dargestellte Möglichkeit an, einen Server zu initiieren.

package de.bastie.howto.lang.start;

import java.net.ServerSocket;
import java.net.BindException;
import java.io.IOException;

/**
 * Title:        Make Java - How To
 * Description:  Eine Anwendung nur einmal starten.
 * Copyright:    Copyright © 2002 - free for all use
 * @author Bastie - Sebastian Ritter
 * @version 1.0.0.0
 *
 * Diese Klasse ermöglicht das Kontrollieren und ggf. Verhindern eines
 * mehrmaligen Startes einer Anwendung auf einem Rechner.
 * Die Prüfung erfolgt über das Belegen eines Netzwerkport am Computer. Beim
 * jedem erzeugen einer Instanz dieser Anwendung wird versucht auf einem Port
 * einen ServerSocket zu erzeugen.
 * Beachten Sie, dass zu diesem Zweck das IP Protokoll auf Ihrem Rechner
 * installiert sein muss.
 */

public class OnlyOneStart implements Runnable{

  /** Auf dem diesem Port wird versucht den Server zu installieren. Die Ports
   *  sind jedoch nicht frei verfügbar. So sind die Ports von 0 bis 1023, auch
   *  "Well Known Ports" genannt sind fest reserviert.
   *  Der zweite Block beginnt bei 1024 und geht bis 49151 und ist von
   *  jederman reservierbar.
   *  Der für uns wichtigste Bereich beginnt jedoch bei 49152 und endet bei
   *  65535. Dieser Bereich wird als private bzw. dynamische Ports bezeichnet.
   */
  private static transient int portNumber = 49152;

  /** Die Methode vom Interface Runnable. */
  public void run () {
    try {
      OnlyOneStart.initServer();
    }
    /* Wenn nun ein Fehler auftritt, dann beenden wir die Anwendung einfach. */
    catch (final BindException serverIsRunning) {
      System.out.println("Die Applikation wurde bereits gestartet.");
      System.exit(1);
    }
    catch (final IOException criticalError){
      System.out.println("Schwerer Fehler"+criticalError.getLocalizedMessage());
      System.exit(2);
    }
  }

  /**
   * Initiiert den Server oder wirft eine Exception, wenn
   * die Anwendung bereits gestartet wurde.
   * @throws BindException
   * @throws IOException
   */
  protected static void initServer () throws BindException, IOException{
    ServerSocket serverSocket =
            new ServerSocket (OnlyOneStart.portNumber);
    serverSocket.accept ();
  }

  /**
   * Prüft, ob die Anwendung bereits gestartet wurde.
   */
  public static void checkApplicationRunning () {
    Thread t = new Thread (new OnlyOneStart());
    t.start();
  }

  /**
   * Und so können Sie diese Klasse verwenden...
   * @param ignored
   */
  public static void main (final String [] ignored) {
    OnlyOneStart.checkApplicationRunning();
    System.out.println("Init Applikation");
  }
}

all rights reserved © Bastie - Sebastian Ritter @: w³: http://www.Bastie.de
Diese Seite ist Bestandteil der Internetpräsenz unter http://www.Bastie.de


Java Cobol Software Resourcen Service Links Über mich Zum Gästebuch Forum