Java 获取Glassfish2域的名称

Java 获取Glassfish2域的名称,java,glassfish,jmx,esb,jcaps,Java,Glassfish,Jmx,Esb,Jcaps,是否可以在Glassfish v2中获取当前域的名称 我有这样一个代码: MemoryMXBean bean = ManagementFactory.getMemoryMXBean(); if (bean != null) { MemoryUsage usage = bean.getNonHeapMemoryUsage(); int current = (int) ((double) usage.getUsed() / usage.getMax()

是否可以在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例外);但是我们有3个appserver正在运行,所以域名将非常有用。。。有什么想法吗


谢谢

您可以使用来获取域名。它是一个可从.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 );
}

如果工作目录为…/domains/domain/config

,您可以这样做:

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"));
MBeanServer连接服务;
if(主机名!=null){
//远程连接
JMXServiceURL u=新的JMXServiceURL(“服务:jmx:rmi:///jndi/rmi://“+hostname+”/jmxrmi”);
字符串[]凭据=新字符串[]{“admin”,“adminadmin”};
映射环境=新建LinkedHashMap();
put(“jmx.remote.credentials”,凭证);
JMXConnector c=JMXConnectorFactory.connect(u,环境);
serv=c.getMBeanServerConnection();
}否则{
//本地连接
serv=ManagementFactory.getPlatformMBeanServer();
}
//连接到AMX
DomainRoot dRoot=ProxyFactory.getInstance(serv.getDomainRoot)(true);
//在域配置中获取管理域名
Map Map=dRoot.getDomainConfig().getProperties();
System.out.println(map.get(“administration.domain.name”);

如果您想在Kevin的答案的基础上连接本地JVM,如果您只想在J2EEDomain mbean上使用getPropertyValue方法来使用JMX(不依赖AMX库),则主机名等于主机:端口

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"});
MBeanServer连接服务;
//远程连接
JMXServiceURL u=新的JMXServiceURL(“服务:jmx:rmi:///jndi/rmi://“+hostname+”/jmxrmi”);
字符串[]凭据=新字符串[]{“admin”,“adminadmin”};
映射环境=新建LinkedHashMap();
put(“jmx.remote.credentials”,凭证);
JMXConnector c=JMXConnectorFactory.connect(u,环境);
serv=c.getMBeanServerConnection();
String domainName=(String)mbsc.invoke(新对象名(“com.sun.appserv:j2eeType=J2EEDomain,name=com.sun.appserv,category=runtime”),“getPropertyValue”,新字符串[]{“administration.domain.name”},新对象[]{“java.lang.String”});

这是我们一直在使用的一种非常简单的方法

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

有一个例子是:;但似乎DomainRoot是从appserver外部使用的(RMI连接)。。。在我的JCAPS环境中,我认为我不能使用特定于appserver的库。。。无论如何谢谢你是的,你当然是对的,但是我怎么知道我应该连接的端口号呢?是鸡和蛋!:)AMX可以从“appserver内部”使用。它是管理控制台/GUI用来收集和编辑配置数据的主要API。这是一个在管理控制台中解决的鸡和蛋的问题。。。也许你应该提出一个与问题的这一方面相关的新问题。+1因为一个简单的事实,你也有被称为JCAPS的痛苦:)你从哪里得到这个
db
对象,它的类别是什么?db对象是我们的oracle表otd。System.getProperty在windows和aix上为我们的生产环境工作