2010-05-17 4 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); но у нас есть 3 сервера приложений, поэтому доменное имя будет действительно полезно ... любая идея?

Благодаря

+0

AMX может быть использован с "внутри сервера приложений. Это основной API, используемый консолью администратора/GUI для сбора и редактирования данных конфигурации. – vkraemer

+0

Это курица и яйцо, которые решаются в консоли администратора ... возможно, вам стоит открыть новый вопрос, связанный с этим аспектом проблемы. – vkraemer

+0

+1 для простого факта, что вы также разделяете боль, известную как JCAPS :) – javamonkey79

ответ

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 = просмотр; но кажется, что DomainRoot предназначен для использования из-за пределов приложения сервера (соединение RMI) ... и в моей среде JCAPS я бы подумал, что я не могу использовать библиотеки приложений, специфичные для сервера ... Спасибо в любом случае – Kevin

+0

да, вы, конечно, правы, но как я могу узнать номер порта, к которому я должен подключиться? это курица и яйцо! :) – Kevin

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

Основываясь на ответе Кевина, если вы просто хотите использовать JMX (не полагаясь на библиотеки AMX), просто используя метод getPropertyValue в 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"}); 
0

Вот очень простой способ, который мы использовали

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

где вы получаете этот объект 'db', каков его класс? – Kevin

+0

Объект db был нашим столом оракула отд. System.getProperty работает над окнами и aix для нас в производстве –