2010-05-14 11 views
13

Ho bisogno di un modo per identificare in modo univoco e permanente un'istanza della JVM dal codice Java in esecuzione in quella JVM.È possibile ottenere un ID univoco per una particolare istanza JVM?

Cioè, se ho due JVM in esecuzione contemporaneamente sulla stessa macchina, ognuna è distinguibile. È inoltre possibile distinguere JVM in esecuzione su altre macchine e da future esecuzioni sulla stessa macchina, anche se l'ID processo viene riutilizzato.

Immagino di poter implementare qualcosa di simile identificando l'ora di inizio, il MAC della macchina e l'ID del processo e combinandoli in qualche modo. Mi chiedo se ci sia un modo standard per raggiungere questo obiettivo.

Aggiornamento: vedo che tutti hanno consigliato un UUID per l'intera sessione. Sembra una buona idea anche se forse un po 'troppo pesante. Ecco il mio problema però: voglio usare l'id JVM per creare più identificatori univoci in ogni esecuzione JVM che in qualche modo incorporano l'istanza JVM.

La mia comprensione è che non si dovrebbero mescolare altri numeri in un UUID perché l'univocità non è più garantita. Un'alternativa è rendere l'UUID in una stringa e incatenarlo, ma diventa troppo lungo. Qualche idea su come superare questo?

+0

Capisco che desideri essere in grado di identificare in modo univoco un'istanza JVM, ma qual è il problema di base che devi risolvere con queste informazioni? –

+0

@Thorbjorn: Ho un sistema distribuito e ho bisogno di 1) Identificare in modo univoco i pacchetti in uscita.2) Mantenerlo 'leggibile' in modo che nei file di registro e nelle informazioni di debug possa identificare rapidamente i pacchetti provenienti dalla stessa istanza. – Uri

risposta

10

È possibile generare un UUID all'inizio del programma e utilizzarlo durante il periodo di esecuzione del programma.

UUID id = UUID.randomUUID(); 

Oltre al metodo randomUUID() ci sono altri metodi per generare UUID s che potrebbero soddisfare le vostre esigenze meglio, vedere la documentazione delle API di classe java.util.UUID per ulteriori informazioni.

+1

mi hai battuto di 30 secondi ... – Barry

1

Perché non utilizzare l'istanza di attesa Singleton di java.rmi.server.UID?

+1

La classe 'java.rmi.server.UID' è basata su un numero di 16 bit. Se l'ID deve essere unico nel tempo, allora è probabile che prima o poi si verifichi una collisione quando si utilizza questa classe. La classe 'java.util.UUID' è basata su un numero di 128 bit, quindi le probabilità di una collisione sono molto minori. – Jesper

4

È possibile creare un UUID all'avvio dell'applicazione e utilizzarlo per l'identificazione.

UUID UniqueID = UUID.randomUUID();

2

Se gli UUID sono troppo pesanti, è necessario rivedere cosa si intende per "in modo univoco e permanente".

Ad esempio, se si desidera limitare "univoco e permanente" per indicare univoco per le macchine su una determinata rete e permanente per i prossimi dieci anni, è possibile utilizzare lo stesso approccio utilizzato nella generazione di UUID ma con meno bit.

In alternativa, se si dovesse creare un servizio di generazione id univoco con un archivio persistente e legare la nozione di "permanente" alla durata di tale archivio, gli ID univoci potrebbero semplicemente essere una sequenza incrementale di numeri interi.

1

Non conosco una libreria standard per questo, ma puoi andare lontano da solo con l'ora di inizio (fai alcuni calcoli con i nuovi java.util.Date() e System.currentMillis), il percorso verso il installazione e il percorso della JVM (prendere in considerazione solo la concatenazione di tutto System.getProperties()).

Avete un server centrale con cui possono parlare? Quindi un uuid può essere recuperato dal server centrale.

Problemi correlati