【问题标题】:Unique ID from a JVM for tracking purposes来自 JVM 的唯一 ID,用于跟踪目的
【发布时间】:2016-10-03 17:57:13
【问题描述】:

假设您的机器上有多个配置不同的 JVM。有没有办法从每个人那里获取一个 GUID/UUID 以传递给在其上运行的应用程序?不是 JVM 的实例,而是启动进程的特定 JVM。我可以编写一个程序来查找机器上的所有 JVM,并在 ClassLoader 阶段(或其他)为它们提供一些元数据以拉入应用程序。

我已经在 .NET 领域工作了一段时间,忘记了用 Java 解决这个问题的最简单方法是什么。如果 Java 中已经内置了一些东西可以很好地为每个 JVM 做到这一点,如果没有,我愿意走单独的分配阶段路线。

最终目标是流经系统的每一笔交易都将有一个与之关联的主 GUID...但我还想用 JVM 在“作业”中标记工作的每个部分工作。想想每台机器有多个 JVM,也许以后......多台机器。

注意:如果用户觉得我使用了错误的标签,请编辑它们。谢谢。

【问题讨论】:

  • VMID 路由在您每次请求时都会更改。提到的服务器套接字方法也不是我想要的。但是解决类似问题的有价值的想法。
  • 有没有办法将 .properties 文件与 JVM 而不是在其下运行的 .jar 关联?是否有能够在每次 JVM 启动时传递 GUID 的约定?这可以轻松地在 40 台其他机器上复制吗?

标签: java transactions jvm


【解决方案1】:

这是解决您的用例的一种可能方法。我们可以指定JVM arguments,我们可以使用 -D 选项指定属性。然后,这些属性可以作为系统属性在 JVM 的整个生命周期内对所有类进行访问。

例如,假设我们启动了一个如下所示的 Java 程序:

java MyProgram -DJVMID=A18342FB-68DD-4C64-B606-301366B8ABB0

现在在 Java 程序中,无论您打算在哪里记录 JVM 的 ID,您所需要做的就是:

String jvmID = (String)(System.getProperty("JVMID");
//log the JVM ID
logger.log(jvmID + " : " + " Activity happened");

请注意,您也可以在此处使用自己的可读字符串作为 JVM id,而不是 UUID。

如果您想将属性文件与包含各种 JVM 属性的 JVM 相关联;这是你如何做到的。假设属性文件的名称是 MyProgram.properties

我们启动JVM如下

java MyProgram -DPROPERTIES_FILE=MyProgram.properties

然后您可以按如下方式加载属性文件。这取自Oracle docs

public static void main(String[] args)
{
    // set up new properties object
        // from file "myProperties.txt"
        String propertyFiletoLoad = (String)(System.getProperty("PROPERTIES_FILE"));
        FileInputStream propFile =
            new FileInputStream( propertyFileToLoad);
        Properties p =
            new Properties();
        p.load(propFile);

        // set the system properties
        System.setProperties(p);

}

main() 中完成上述操作后,您只需调用System.getProperty("propertyName"); 即可在Java 程序的任何位置访问您需要的任何属性

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-10-08
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多