2010-05-14 5 views
13

Ich brauche eine Möglichkeit, eine Instanz der JVM aus Java-Code, der in dieser JVM läuft, eindeutig und dauerhaft zu identifizieren.Ist es möglich, eine wirklich eindeutige ID für eine bestimmte JVM-Instanz zu erhalten?

Das heißt, wenn ich zwei JVMs auf der gleichen Maschine zur gleichen Zeit laufen haben, ist jeder unterscheidbar. Sie unterscheidet sich auch von laufenden JVMs auf anderen Computern und von zukünftigen Ausführungen auf demselben Computer, selbst wenn die Prozess-ID erneut verwendet wird.

Ich glaube, ich könnte so etwas implementieren, indem ich die Startzeit, den MAC der Maschine und die Prozess-ID identifiziere und sie auf irgendeine Weise kombiniere. Ich frage mich, ob es einen Standardweg gibt, um dies zu erreichen.

Update: Ich sehe, dass jeder eine UUID für die gesamte Sitzung empfohlen. Das scheint eine gute Idee zu sein, wenn auch vielleicht etwas zu schwer. Hier ist mein Problem: Ich möchte die JVM-ID verwenden, um mehrere eindeutige Bezeichner in jeder JVM-Ausführung zu erstellen, die irgendwie die JVM-Instanz enthalten.

Mein Verständnis ist, dass Sie nicht wirklich andere Zahlen in eine UUID mischen sollten, weil die Eindeutigkeit nicht mehr garantiert ist. Eine Alternative besteht darin, die UUID zu einer Zeichenfolge zu machen und sie zu verketten, aber dann wird sie zu lang. Irgendwelche Ideen, um das zu überwinden?

+0

Ich verstehe, dass Sie eine JVM-Instanz eindeutig identifizieren können, aber was ist das zugrunde liegende Problem, das Sie mit diesen Informationen lösen sollen? –

+0

@Thorbjorn: Ich habe ein verteiltes System, und ich muss 1) Ausgehende Pakete eindeutig identifizieren.2) Pflegen Sie es "menschlich lesbar", so dass ich in Log-Dateien und Debug-Informationen schnell Pakete identifizieren kann, die von derselben Instanz stammen. – Uri

Antwort

10

Sie könnten am Anfang Ihres Programms eine UUID generieren und diese während der Laufzeit des Programms verwenden.

UUID id = UUID.randomUUID(); 

Neben dem Verfahren randomUUID() gibt es andere Methoden UUID s zu erzeugen, die Ihre Bedürfnisse besser passen könnten, die API-Dokumentation der Klasse java.util.UUID für weitere Informationen.

+1

Sie schlagen mich um 30 Sekunden ... – Barry

1

Warum nicht Singleton Holding Instanz von java.rmi.server.UID?

+1

Klasse 'java.rmi.server.UID' basiert auf einer 16-Bit-Nummer. Wenn die ID im Laufe der Zeit eindeutig sein sollte, sind die Chancen groß, dass Sie früher oder später bei der Verwendung dieser Klasse eine Kollision bekommen. Die Klasse 'java.util.UUID' basiert auf einer 128-Bit-Zahl, sodass die Wahrscheinlichkeit einer Kollision wesentlich geringer ist. – Jesper

4

Sie können beim Start der Anwendung eine UUID erstellen und diese zur Identifizierung verwenden.

UUID UniqueID = UUID.randomUUID();

2

Wenn UUIDs zu schwer sind, müssen Sie überprüfen, was Sie mit "eindeutig und dauerhaft" meinen. Wenn Sie beispielsweise "unique und permanent" für Maschinen in einem bestimmten Netzwerk als eindeutig und für die nächsten (etwa 10) Jahre als permanent festlegen, können Sie den gleichen Ansatz wie bei der UUID-Generierung, aber mit. Verwenden weniger Bits.

Wenn Sie einen eindeutigen ID-Generierungsdienst mit einem persistenten Speicher erstellen und den Begriff "permanent" mit der Lebensdauer dieses Speichers verknüpfen möchten, könnten die eindeutigen IDs einfach eine inkrementierende Sequenz von ganzen Zahlen sein.

1

Ich kenne keine Standardbibliothek dafür, aber Sie können mit der Startzeit weit kommen (machen Sie einige Berechnungen mit neuen java.util.Date() und System.currentMillis), der Pfad zu der Installation und der Pfad zur JVM (betrachten Sie nur alle System.getProperties()).

Haben Sie einen zentralen Server, mit dem sie sprechen können? Dann kann eine UUID vom zentralen Server abgerufen werden.