来自JVM的唯一ID,用于跟踪目的

时间:2016-10-03 17:57:13

标签: java transactions jvm

假设你有一台机器上有多个JVM,配置不同。有没有办法从每个GUID / UUID传入其中运行的应用程序?不是JVM的实例,而是启动进程的特定JVM。我可以编写一个程序来搜索计算机上的所有JVM,并在ClassLoader阶段(或其他东西)为他们提供一些元数据以便进入应用程序。

我已经在.NET领域工作了一段时间,忘了在Java中解决这个问题的最简单方法。如果已经在Java中构建了可以为每个JVM做到这一点的东西,那么如果不是,我愿意去单独的分配阶段路径。

最终目标是流经系统的每一笔交易都会有一个与之相关的主要GUID ......但我还要在一份工作中标记每一部分工作"与JVM完成了这部分工作。考虑每台机器多个JVM,也许以后......多台机器。

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

1 个答案:

答案 0 :(得分: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程序中任何位置所需的任何属性。

希望这有帮助。