我需要一种从JVM中运行的Java代码中唯一且永久地识别JVM实例的方法。
也就是说,如果我在同一台机器上同时运行两个JVM,则每个JVM都是可区分的。 它也可以与在其他计算机上运行JVM以及在同一台计算机上的未来执行区分开来,即使重用了进程ID也是如此。
我想我可以通过识别开始时间,机器MAC和进程ID来实现这样的东西,并以某种方式组合它们。我想知道是否有一些标准的方法来实现这一点。
更新:我看到每个人都为整个会话推荐了一个UUID。这似乎是一个好主意,虽然可能有点太重量级。这是我的问题:我想使用JVM id在每个JVM执行中创建多个唯一标识符,以某种方式合并JVM实例。
我的理解是,您不应该将其他数字混合到UUID中,因为不再保证唯一性。另一种方法是将UUID转换为字符串并将其链接,但随后它变得太长。克服这个想法?
答案 0 :(得分:11)
您可以在程序开始时生成UUID
,并在程序运行期间使用它。
UUID id = UUID.randomUUID();
除了方法randomUUID()
之外,还有其他方法可以生成更适合您需求的UUID
,有关详细信息,请参阅类java.util.UUID
的API文档。
答案 1 :(得分:4)
您可以在应用程序启动时创建UUID并将其用于标识。
UUID UniqueID = UUID.randomUUID();
答案 2 :(得分:2)
如果UUID太重,你需要“独特而永久地”回顾你的意思。
例如,如果要将“唯一且永久”限制为对于给定网络上的计算机而言是唯一的,并且对于下一个(比如说)10年而言是永久性的,则可以使用在UUID生成中使用的相同方法但是更少位。
或者,如果您要使用持久性存储创建唯一的id生成服务,并将“permanent”的概念与该存储的生命周期联系起来,那么唯一的ID可能只是一个递增的整数序列。
答案 3 :(得分:1)
为什么不使用{@ 1}}的单例持有实例?
答案 4 :(得分:1)
我不知道有一个标准的库,但你可以自己开始时间(使用新的java.util.Date()和System.currentMillis进行一些计算),安装的路径,以及JVM的路径(考虑只连接所有System.getProperties())。
你有可以与之交谈的中央服务器吗?然后可以从中央服务器中检索uuid。