2010-05-17 19 views
1

est-il possible d'obtenir le nom du domaine actuel dans Glassfish v2?Obtenez le nom d'un domaine Glassfish2

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 de tomber en panne (exception de l'espace PermGen); mais nous avons 3 appserver en cours d'exécution, donc le nom de domaine serait vraiment utile ... une idée?

Merci

+0

AMX peut être utilisé à partir «à l'intérieur du serveur d'applications. Il s'agit de l'API principale utilisée par la console d'administration/l'interface graphique pour collecter et modifier les données de configuration. – vkraemer

+0

C'est une poule et un oeuf qui est résolu dans la console d'administration ... peut-être que vous devriez ouvrir une nouvelle question liée à cet aspect du problème. – vkraemer

+0

+1 pour le simple fait que vous partagez également la douleur connue sous le nom JCAPS :) – javamonkey79

Répondre

1

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 égal à "host:port" ou null si vous souhaitez connecter la JVM locale

1

Vous pouvez utiliser AMX pour obtenir le nom de domaine. C'est un disponible à partir de DomainRoot .getAppserverDomainName().

+0

il y a un exemple à http://docs.sun.com/app/docs/doc/820-4336/beapq?l=en&a = vue; mais il semble que DomainRoot est destiné à être utilisé depuis l'extérieur du serveur d'applications (connexion RMI) ... et dans mon environnement JCAPS, je pense que je ne peux pas utiliser les bibliothèques spécifiques à appserver ... Merci quand même – Kevin

+0

oui, Vous avez certainement raison, mais comment puis-je connaître le numéro de port auquel je suis censé me connecter? c'est le poulet et l'oeuf! :) – Kevin

1

ce n'est pas la solution la plus belle, mais ce hack fonctionne:

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

0

En se basant 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 le 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"}); 
0

Voici une manière 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")); 
+0

où obtenez-vous cet objet 'db', quelle est sa classe? – Kevin

+0

objet db était notre otacle table otd. System.getProperty fonctionne sur Windows et aix pour nous en production –