Obtenha o nome de um domínio Glassfish2
Pergunta
É possível obter o nome do domínio atual no Glassfish V2?
Eu tenho um código como:
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
}
o que nos enviaria um e -mail quando o AppServer estiver prestes a travar (exceção do espaço permgen); Mas temos 3 aplicativos em execução, então o nome de domínio seria realmente útil ... alguma ideia?
Obrigado
Solução 3
Você pode fazer desta maneira:
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"));
com hostname
igual a "host:port"
, ou null
Se você quiser conectar a JVM local
Outras dicas
Você pode usar AMX Para obter o nome de domínio. É um disponível de Domainroot.GetAppServerDomainName ().
Não é a solução mais bonita, mas esse hack funciona:
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 );
}
desde que o diretório de trabalho seja .../domínios/domínio/configuração
Com base na resposta de Kevin, se você deseja apenas usar o JMX (sem confiar nas bibliotecas AMX) apenas usando o método getPropertyValue no J2eedomain MBean.
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"});
Aqui está uma maneira muito simples que estamos usando
db.getHISTORICAL_MEMORY_USAGE().setDOMAIN( System.getProperty( "domain.name" ) );
db.getHISTORICAL_MEMORY_USAGE().setSERVER( System.getProperty( "com.sun.aas.hostName" ) );