2010-05-14 28 views
13

我需要一种方法,从运行在该JVM中的Java代码中唯一地永久标识JVM的实例。是否有可能为特定的JVM实例获取真正唯一的ID?

也就是说,如果我有两个JVM在同一台机器上同时运行,每个都是可区分的。 它也可以区别于在其他机器上运行JVM和在同一台机器上执行未来执行,即使进程ID被重用。

我想我可以通过识别开始时间,机器MAC和进程ID并以某种方式组合它们来实现这样的事情。我想知道是否有一些标准的方法来实现这一点。

更新:我看到每个人都推荐整个会话的UUID。这似乎是一个好主意,虽然可能有点太重量级。这是我的问题,但我想使用JVM id在每个JVM执行中创建多个唯一标识符,以某种方式合并JVM实例。

我的理解是,您不应该将其他数字混入UUID,因为唯一性不再有保证。另一种方法是将UUID变成一个字符串并链接起来,但后来变得太长了。任何想法克服这个?

+0

我知道您希望能够唯一标识JVM实例,但是您要使用此信息解决的底层问题是什么? – 2010-05-14 14:28:47

+0

@Thorbjorn:我有一个分布式系统,我需要1)唯一标识传出数据包。2)在日志文件和调试信息中保持“人类可读”,我可以快速识别来自同一实例的数据包。 – Uri 2010-05-14 15:04:25

回答

10

您可以在程序开始时生成UUID,并在程序运行期间使用该程序。

UUID id = UUID.randomUUID(); 

除了方法randomUUID()还有其他方法来生成UUID s表示可能会满足您的需求更好,看到java.util.UUID类的API文档的详细信息。

+1

你打我30秒... – Barry 2010-05-14 14:16:49

1

为什么不使用Singleton持有java.rmi.server.UID的实例?

+1

java.rmi.server.UID类是基于一个16位数字。如果随着时间的推移ID应该是唯一的,那么使用这个课程迟早会发生碰撞的机会很大。 java.util.UUID类基于128位数字,所以碰撞的几率要小得多。 – Jesper 2010-05-14 14:21:41

4

您可以在应用程序启动时创建一个UUID并将其用于识别。

UUID UniqueID = UUID.randomUUID();

2

如果UUID过重,则需要查看“唯一且永久”的含义。例如,如果要将“唯一和永久”限制为对给定网络中的机器是唯一的,对于下一个(比如说)10年是永久的,则可以使用与UUID生成中使用的方法相同的方法,但与更少的位。或者,如果您要创建一个具有持久性存储的唯一ID生成服务,并将“永久性”的概念与该存储的生命周期相关联,那么唯一ID可能只是一个递增的整数序列。

1

我不知道这个标准库,但你可以用自己的开始时间远离(使用新的java.util.Date()和System.currentMillis做一些计算),到安装以及JVM的路径(可以考虑只连接所有System.getProperties())。

你有一个中央服务器可以与之通话吗?然后,可以从中央服务器中取回uuid。

相关问题