2010-05-14 4 views
13

Мне нужен способ однозначно и надолго идентифицировать экземпляр JVM из кода Java, запущенного в этой JVM.Возможно ли получить уникальный уникальный идентификатор для конкретного экземпляра JVM?

То есть, если у меня есть два JVM, работающих одновременно на одной машине, каждая из них различима. Он также отличается от запуска JVM на других машинах и от будущих исполнений на одной машине, даже если идентификатор процесса повторно используется.

Я полагаю, что я мог бы реализовать что-то вроде этого, идентифицируя время начала, MAC-адрес машины и идентификатор процесса и каким-то образом сочетая их. Мне интересно, есть ли какой-то стандартный способ достичь этого.

Обновление: Я вижу, что все рекомендовали UUID для всего сеанса. Это кажется хорошей идеей, хотя, возможно, слишком тяжелым. Вот моя проблема: я хочу использовать JVM id для создания нескольких уникальных идентификаторов в каждом исполнении JVM, которые каким-то образом включают экземпляр JVM.

Я понимаю, что вы не должны смешивать другие числа с UUID, потому что уникальность больше не гарантируется. Альтернативой является включение UUID в цепочку и ее цепочку, но затем она становится слишком длинной. Есть идеи по преодолению этого?

+0

Я понимаю, что вы хотите уникально идентифицировать экземпляр JVM, но какова основная проблема, которую вы должны решить с помощью этой информации? –

+0

@Thorbjorn: У меня есть распределенная система, и мне нужно: 1) Уникально идентифицировать исходящие пакеты.2) Поддерживайте это «удобочитаемый человек», поэтому в файлах журналов и информации об отладке я могу быстро определить пакеты, которые поступают из одного и того же экземпляра. – Uri

ответ

10

Вы можете создать UUID в начале вашей программы и использовать его во время работы программы.

UUID id = UUID.randomUUID(); 

Кроме того, метод randomUUID() существуют и другие методы для генерации UUID S, которые могли бы соответствовать вашим потребностям лучше, обратитесь к документации по API класса java.util.UUID для получения дополнительной информации.

+1

вы избили меня на 30 секунд ... – Barry

1

Почему бы не использовать Singleton, содержащий экземпляр java.rmi.server.UID?

+1

Класс 'java.rmi.server.UID' основан на 16-битном номере. Если идентификатор должен быть уникальным с течением времени, тогда шансы велики, что рано или поздно вы столкнетесь с конфликтом при использовании этого класса. Класс 'java.util.UUID' основан на 128-битном числе, поэтому вероятность столкновения намного меньше. – Jesper

4

Вы можете создать UUID при запуске приложения и использовать его для идентификации.

UUID UniqueID = UUID.randomUUID();

2

Если UUIDs слишком тяжелый, вам нужно просмотреть, что вы имеете в виду под «уникальным и постоянным».

Например, если вы должны были ограничивать «уникальные и постоянные», что означало бы уникальные для машин в данной сети и постоянные для следующего (скажем) 10 лет, вы могли бы использовать тот же подход, который использовался в генерации UUID, но с меньше бит.

В качестве альтернативы, если вы должны создать уникальную службу генерации идентификаторов с постоянным хранилищем и связать понятие «постоянный» с временем жизни этого хранилища, то уникальные идентификаторы могут быть просто инкрементной последовательностью целых чисел.

1

Я не знаю стандартной библиотеки для этого, но вы можете зайти далеко друг от друга со временем начала (выполните некоторые вычисления с помощью новых java.util.Date() и System.currentMillis), путь к установки и пути к JVM (рассмотрим только объединение всех System.getProperties()).

У вас есть центральный сервер, с которым можно поговорить? Затем uuid может быть восстановлен с центрального сервера.