Obtenez le nom d'un domaine Glassfish2
Question
est-il possible d'obtenir le nom du domaine actuel dans Glassfish v2?
J'ai un code comme:
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
}
qui nous envoyer un e-mail lorsque le serveur d'applications est sur le point d'accident (exception de l'espace PermGen); mais nous avons 3 en cours d'exécution du serveur d'applications, de sorte que le nom de domaine serait vraiment utile ... une idée?
Merci
La solution 3
vous pouvez le faire de cette façon:
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"));
avec hostname
est égal à "host:port"
ou null
si vous souhaitez connecter la JVM locale
Autres conseils
Vous pouvez utiliser AMX pour obtenir le nom de domaine. Il est disponible à partir de DomainRoot .getAppserverDomainName ().
ce n'est pas la plus belle solution, mais cela fonctionne hack:
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 );
}
à condition que le répertoire de travail est ... / domaines / domaine / config
Miser sur la réponse de Kevin, si vous voulez juste utiliser JMX (sans compter sur les bibliothèques AMX) en utilisant simplement la méthode getPropertyValue sur les MBean J2EEDomain.
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"});
Voici un moyen très simple que nous avons utilisé
db.getHISTORICAL_MEMORY_USAGE().setDOMAIN( System.getProperty( "domain.name" ) );
db.getHISTORICAL_MEMORY_USAGE().setSERVER( System.getProperty( "com.sun.aas.hostName" ) );