2010-05-14 16 views
13

Necesito una forma de identificar única y permanentemente una instancia de la JVM desde el código Java que se ejecuta en esa JVM.¿Es posible obtener una identificación verdaderamente única para una instancia de JVM en particular?

Es decir, si tengo dos máquinas virtuales de Java se ejecutan al mismo tiempo en la misma máquina, cada uno es distinguible. También se puede distinguir de ejecutar JVM en otras máquinas y de ejecuciones futuras en la misma máquina, incluso si se reutiliza la identificación del proceso.

Calculo que podría implementar algo como esto mediante la identificación de la hora de inicio, la máquina de MAC y el ID del proceso, y la combinación de ellos de alguna manera. Me pregunto si hay alguna forma estándar de lograr esto.

Actualización: veo que todos recomendaron un UUID para toda la sesión. Parece una buena idea, aunque posiblemente sea un poco demasiado pesada. Sin embargo, este es mi problema: quiero usar el ID de JVM para crear múltiples identificadores únicos en cada ejecución de JVM que de alguna manera incorporen la instancia de JVM.

Mi comprensión es que realmente no debería mezclar otros números en un UUID porque la exclusividad ya no está garantizada. Una alternativa es hacer que el UUID se convierta en una cadena y encadenarlo, pero luego se vuelve demasiado largo. Alguna idea sobre superar esto?

+0

Entiendo que desea poder identificar de manera única una instancia de JVM, pero ¿cuál es el problema subyacente que debe resolver con esta información? –

+0

@Thorbjorn: Tengo un sistema distribuido, y necesito 1) Identificar de manera exclusiva los paquetes salientes.2) Mantenerlo 'legible por humanos' para que en los archivos de registro y la información de depuración pueda identificar rápidamente los paquetes que provienen de la misma instancia. – Uri

Respuesta

10

podría generar un UUID al comienzo de su programa y el uso que durante el tiempo que el programa se está ejecutando.

UUID id = UUID.randomUUID(); 

Además del método randomUUID() hay otros métodos para generar UUID s que podrían ajustarse mejor a sus necesidades, consulte la documentación de la API de la clase java.util.UUID para más información.

+1

me ganaste por 30 segundos ... – Barry

1

¿Por qué no utilizar la instancia de retención Singleton de java.rmi.server.UID?

+1

La clase 'java.rmi.server.UID' se basa en un número de 16 bits. Si la ID debe ser única a lo largo del tiempo, es probable que tarde o temprano se produzca una colisión al usar esta clase. La clase 'java.util estadounidense' se basa en un número de 128 bits, por lo que las posibilidades de una colisión son mucho menores. – Jesper

4

Puede crear un UUID al iniciar la aplicación y usarlo para la identificación.

UUID UniqueID = UUID.randomUUID();

2

Si UUID son demasiado grueso y resistente, es necesario revisar lo que quiere decir con "única y permanente".

Por ejemplo, si limitase "único y permanente" para significar único para las máquinas en una red determinada, y permanente para los próximos (digamos) 10 años, podría usar el mismo enfoque utilizado en la generación UUID pero con menos bits

Alternativamente, si creara un servicio de generación de id único con una tienda persistente y vincule la noción de "permanente" a la vida útil de esa tienda, entonces los identificadores únicos podrían ser simplemente una secuencia creciente de enteros.

1

No conozco una biblioteca estándar para esto, pero puede ir por su cuenta con la hora de inicio (haga algunos cálculos con los nuevos java.util.Date() y System.currentMillis), la ruta a la instalación y la ruta a la JVM (considere concatenar todo System.getProperties()).

¿Tiene un servidor central con el que puedan hablar? Luego, se puede recuperar un uuid del servidor central.

Cuestiones relacionadas