سؤال

هل من الممكن الحصول على اسم المجال الحالي في Glassfish V2؟

لدي رمز مثل:

    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
        }

والتي من شأنها أن ترسل لنا بريدًا إلكترونيًا عندما يكون AppServer على وشك التعطل (Permgen Space Exception) ؛ لكن لدينا 3 تطبيقات تشغيل ، وبالتالي فإن اسم المجال سيكون مفيدًا حقًا ... أي فكرة؟

شكرًا

هل كانت مفيدة؟

المحلول 3

يمكنك أن تفعل ذلك بهذه الطريقة:

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 المحلي

نصائح أخرى

يمكنك استخدام AMX للحصول على اسم المجال. إنه متاح من المجهر.getAppServerDomainName ().

إنه ليس الحل الأكثر جمالًا ، لكن هذا الاختراق يعمل:

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 );
}

شريطة أن يكون دليل العمل .../المجالات/المجال/التكوين

بناءً على إجابة Kevin ، إذا كنت ترغب فقط في استخدام JMX (دون الاعتماد على مكتبات AMX) فقط باستخدام طريقة GetPropertyValue على 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"});

إليك طريقة بسيطة حقًا نستخدمها

db.getHISTORICAL_MEMORY_USAGE().setDOMAIN( System.getProperty( "domain.name" ) );
db.getHISTORICAL_MEMORY_USAGE().setSERVER( System.getProperty( "com.sun.aas.hostName" ) );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top