使用哪些MBean(以及如何)以编程方式确定Weblogic中部署的应用程序(CQ5)的内存低点

时间:2012-12-01 01:23:31

标签: memory weblogic jmx mbeans

我必须编写一个监视CQ5的独立Java应用程序,部署在Weblogic中(特别是内存使用)。

我能够使用下面的类(在文档中找到)连接到weblogic中的域运行时服务器。

现在,我想知道我需要监视内存低点的MBean,因此无论何时达到某个阈值,我都可以触发事件。

你们中有谁能给我一些见解吗?这是一个纯粹的JMX / Java问题,与CQ无关。

我正在尝试以编程方式重新创建Jconsole已经执行的操作。但我需要以编程方式进行编程,因为我需要在遇到某些阈值时与外部API通信。

public class PrintServerState {
    private static MBeanServerConnection connection;
    private static JMXConnector connector;
    private static final ObjectName service;

    private static final ObjectName bundleWrite;
    static {
        try {
            service = new ObjectName("com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");
        } catch (MalformedObjectNameException e) {
            throw new AssertionError(e.getMessage());
        }
    }
/*
* Initialize connection to the Domain Runtime MBean Server
*/
public static void initConnection(String hostname, String portString,
                                  String username, String password) throws IOException,
        MalformedURLException {
    String protocol = "t3";
    Integer portInteger = Integer.valueOf(portString);
    int port = portInteger.intValue();
    String jndiroot = "/jndi/";
    String mserver = "weblogic.management.mbeanservers.domainruntime";
    JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname,
            port, jndiroot + mserver);
    Hashtable h = new Hashtable();
    h.put(Context.SECURITY_PRINCIPAL, username);
    h.put(Context.SECURITY_CREDENTIALS, password);
    h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
            "weblogic.management.remote");
    connector = JMXConnectorFactory.connect(serviceURL, h);

    connection = connector.getMBeanServerConnection();
    System.out.println("***************** get mbean count ************************* " + connection.getMBeanCount());
    Set<ObjectName> mbeans = connection.queryNames(null, null);

    for (ObjectName mbeanName : mbeans) {
        System.out.println(mbeanName);
    }

    System.out.println("********************** ---- ***********************");
}
/*
* Print an array of ServerRuntimeMBeans.
* This MBean is the root of the runtime MBean hierarchy, and
* each server in the domain hosts its own instance.
*/
public static ObjectName[] getServerRuntimes() throws Exception {
    return (ObjectName[])connection.getAttribute(service,
            "ServerRuntimes");
}


/*
* Iterate through ServerRuntimeMBeans and get the name and state
*/
public void printNameAndState() throws Exception {
    ObjectName[] serverRT = getServerRuntimes();
    System.out.println("got server runtimes");
    int length = (int) serverRT.length;
    for (int i = 0; i < length; i++) {
        String name = (String) connection.getAttribute(serverRT[i],
                "Name");
        String state = (String) connection.getAttribute(serverRT[i],
                "Type");

        System.out.println("Server name: " + name + ".   Server state: "
                + state);

    }
}
public static void main(String[] args) throws Exception {
    String hostname = args[0];
    String portString = args[1];
    String username = args[2];
    String password = args[3];
    PrintServerState s = new PrintServerState();
    System.out.println("hostname " + hostname);
    System.out.println("portString " + portString);
    System.out.println("username " + username);
    System.out.println("password " + password);
    initConnection(hostname, portString, username, password);
    System.out.println("**************************************************");
    s.printNameAndState();
    connector.close();
}
}

1 个答案:

答案 0 :(得分:0)

这会有所帮助 -

  

domainRuntime()    cd('/ ServerRuntimes /'+ eval('managedServerName')+'/ JVMRuntime /'+ eval('managedServerName'))    heapFreeCurrentPerOld = str(cmo.getHeapFreePercent())    heapFreeCurrentValOld = str(cmo.getHeapFreeCurrent())