2010-05-17 82 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