2016-10-03 30 views
3

假設您有一臺具有多個JVM的機器,並且具有不同的配置。有沒有辦法從每個GUID/UUID傳遞到它上面運行的應用程序?不是JVM的實例,而是啓動進程的特定JVM。我可以編寫一個程序來查找機器上的所有JVM,並在ClassLoader階段(或其他)階段爲它們提供一些元數據,以便將它們引入應用程序。來自JVM的唯一ID用於跟蹤目的

我在.NET空間中已經有一段時間了,忘記了在Java中解決這個問題最簡單的方法。如果有一些已經內置到Java的東西可以爲每個JVM做到這一點,如果沒有,我願意去分開的分配階段路線。

最終目標是流經系統的每一筆交易都會有一個與之相關的主要GUID ......但是我也想用JVM來完成工作中的每一部分工作的工作。考慮每臺機器上的多個JVM,或許以後......多臺機器。

注意:如果用戶覺得我使用了錯誤的標籤,請修改它們。謝謝。

+1

這有幫助嗎? http://stackoverflow.com/questions/8302634/how-to-obtain-unique-jvm-identifier –

+0

VMID路線在您每次需要時都會更改。上面提到的服務器套接字方法並不完全是我正在尋找的。但有價值的想法來解決類似的問題。 – BuddyJoe

+0

有沒有辦法將一個.properties文件與一個JVM關聯,而不是運行在它下面的一個.jar?每次JVM啓動時,是否有一個能夠傳遞GUID的約定?這可以輕鬆地複製到其他40臺機器上? – BuddyJoe

回答

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程序中任何地方的任何財產。