2010-05-17 81 views
1

是否可以在Glassfish v2中獲取當前域的名稱?獲取Glassfish2域的名稱

我有一個像代碼:

MemoryMXBean bean = ManagementFactory.getMemoryMXBean(); 
    if (bean != null) { 
     MemoryUsage usage = bean.getNonHeapMemoryUsage(); 
     int current = (int) ((double) usage.getUsed()/usage.getMax() * 100); 
     ch.log(Level.INFO, "Memory usage : (non heap) " + usage + " -- "+current+"% (limit:"+THRESHOLD+"%)"); 
     if (current > THRESHOLD) { 
      //send email 
     } 

這會向我們發送電子郵件時,應用程序服務器即將崩潰(PermGen space的除外);但我們有3個應用程序服務器正在運行,所以域名真的很有用......任何想法?

感謝

+0

AMX可以從「應用程序服務器內的」使用一個非常簡單的方法。它是管理控制檯/ GUI用於收集和編輯配置數據的主要API。 – vkraemer 2010-05-18 13:30:54

+0

這是一個雞和雞蛋,在管理控制檯解決...也許你應該打開一個新的問題有關的這方面的問題。 – vkraemer 2010-05-18 17:11:38

+0

+ 1爲簡單的事實,你也分享在疼痛稱爲JCAPS :) – javamonkey79 2010-12-09 21:42:41

回答

1

你能做到這樣:

MBeanServerConnection serv; 
if (hostname != null) { 
    //remote connection 
    JMXServiceURL u = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + hostname + "/jmxrmi"); 
    String[] credentials = new String[]{"admin", "adminadmin"}; 
    Map<String, String[]> environment = new LinkedHashMap<String, String[]>(); 
    environment.put("jmx.remote.credentials", credentials); 

    JMXConnector c = JMXConnectorFactory.connect(u, environment); 
    serv = c.getMBeanServerConnection(); 
} else { 
    //local connection 
    serv = ManagementFactory.getPlatformMBeanServer(); 
} 

//connect to AMX 
DomainRoot dRoot = ProxyFactory.getInstance(serv).getDomainRoot(true) ; 

//get the Administrative domain name in the Domain Configuration 
Map<String, String> map = dRoot.getDomainConfig().getProperties() ; 
System.out.println(map.get("administrative.domain.name")); 

hostname等於"host:port",或null如果您想要連接的本地JVM

1

您可以使用AMX獲得域名。它可從DomainRoot .getAppserverDomainName()獲得。

+0

有一個例子在http://docs.sun.com/app/docs/doc/820-4336/beapq?l=en&a = view;但似乎DomainRoot是從應用程序服務器(RMI連接)之外使用的......並且在我的JCAPS環境中,我認爲我無法使用特定於應用程序服務器的庫......無論如何謝謝 – Kevin 2010-05-18 10:45:29

+0

是的,你當然是對的,但是我怎麼知道我應該連接的端口號?這是雞和雞蛋! :) – Kevin 2010-05-18 15:04:56

1

它不是最美麗的解決方案,但這個技巧的工作原理:

String dirName = (new File("..")).getCanonicalPath(); 
int dirNameIdx = dirName.lastIndexOf(File.separator); 
if (dirNameIdx != -1) 
    APPSERVER = dirName.substring(dirNameIdx + 1); 
    ch.log(Level.INFO, "Memory usage: Appserver name: " + APPSERVER); 
} 

提供的工作目錄是... /域/域名/配置

0

基於Kevin的回答,如果您只是想使用JMX(不依賴於AMX庫),只需使用J2Emain mbean上的getPropertyValue方法即可。

MBeanServerConnection serv; 

//remote connection 
JMXServiceURL u = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + hostname + "/jmxrmi"); 
String[] credentials = new String[]{"admin", "adminadmin"}; 
Map<String, String[]> environment = new LinkedHashMap<String, String[]>(); 
environment.put("jmx.remote.credentials", credentials); 

JMXConnector c = JMXConnectorFactory.connect(u, environment); 
serv = c.getMBeanServerConnection(); 
String domainName = (String) mbsc.invoke(new ObjectName("com.sun.appserv:j2eeType=J2EEDomain,name=com.sun.appserv,category=runtime"), "getPropertyValue", new String[] {"administrative.domain.name"}, new Object[] {"java.lang.String"}); 
0

這是我們一直在使用

db.getHISTORICAL_MEMORY_USAGE().setDOMAIN(System.getProperty("domain.name")); 
db.getHISTORICAL_MEMORY_USAGE().setSERVER(System.getProperty("com.sun.aas.hostName")); 
+0

你在哪裏得到這個'db'對象,它的類是什麼? – Kevin 2013-01-24 08:55:13

+0

db對象是我們的oracle表otd。 System.getProperty適用於我們的Windows和aix – 2013-01-24 20:36:18