java如何监控weblogic 12

现在我想用Java去实现对weblogic的监控,不知道大神们有没有什么好的方法,最好详细点的

使用JMX可以对weblogic进行监控。给你点资料
API:http://docs.oracle.com/cd/E13222_01/wls/docs90/wlsmbeanref/core/index.html

我现在正在做weblogic监控这方面的东西呢,如果有什么问题,可以联系我咱俩互相讨论,顺便附上我最初的测试代码
package com.whm.test.weblogic;

import java.io.IOException;
import java.net.MalformedURLException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;

import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

import weblogic.health.HealthState;

public class JmxWeblogic {

private static MBeanServerConnection connection;
private static JMXConnector connector;

private static ObjectName runtimeService;

private static final String RUNTIMESERVICEMBEAN = "com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean";

/**
 * 初始化连接
 * 
 * @throws IOException
 * @throws MalformedURLException
 * @throws MalformedObjectNameException
 */
public static void initConnection() throws IOException,
        MalformedURLException, MalformedObjectNameException {
    String protocol = "t3";
    // String hostname = "192.168.161.101";
    // String portString = "7001";
    // String username = "weblogic";
    // String password = "wang1234";
    String hostname = "127.0.0.1";
    String portString = "7001";
    String username = "test";
    String password = "test1234";
    Integer portInteger = Integer.valueOf(portString);
    int port = portInteger.intValue();
    String jndiroot = "/jndi/";
    String mserver = "weblogic.management.mbeanservers.runtime";
    JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname, port,
            jndiroot + mserver);

    Hashtable<String, String> h = new Hashtable<String, String>();
    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();

    runtimeService = new ObjectName(RUNTIMESERVICEMBEAN);
}

/**
 * 连接池管理
 * 
 * @param serverRuntime
 * @throws AttributeNotFoundException
 * @throws InstanceNotFoundException
 * @throws MBeanException
 * @throws ReflectionException
 * @throws IOException
 */
public void getConnectorServiceRuntime(ObjectName serverRuntime)
        throws AttributeNotFoundException, InstanceNotFoundException,
        MBeanException, ReflectionException, IOException {
    // 应用服务运行时 ApplicationRuntimes
    ObjectName[] applicationRuntimes = getAttribute(serverRuntime,
            "ApplicationRuntimes");
    for (int i = 0; i < applicationRuntimes.length; i++) {
        ObjectName applicationRuntime = applicationRuntimes[i];
        ObjectName[] componentRuntimes = getAttribute(applicationRuntime,
                "ComponentRuntimes");
        for (int j = 0; j < componentRuntimes.length; j++) {
            ObjectName componentRuntime = componentRuntimes[j];
            String type = getAttribute(componentRuntime, "Type");
            System.out.println(type);
            if (!type.equals("ConnectorComponentRuntime")) {
                continue;
            }

            ObjectName[] connectionPools = getAttribute(componentRuntime,
                    "ConnectionPools");
            for (int k = 0; k < connectionPools.length; k++) {
                ObjectName connectionPool = connectionPools[k];
                // 连接池的状态 State
                String state = getAttribute(connectionPool, "State");
                // 服务名称 Name
                String name = getAttribute(connectionPool, "Name");
                // 连接池名称 PoolName
                String poolName = getAttribute(connectionPool, "PoolName");
                // 连接池中的当前使用的连接数量 ActiveConnectionsCurrentCount
                Integer activeConnectionsCurrentCount = getAttribute(
                        connectionPool, "ActiveConnectionsCurrentCount");
                // 等待池中连接的最大客户数 HighestNumWaiters
                Long highestNumWaiters = getAttribute(connectionPool,
                        "HighestNumWaiters");
                // 丢失的连接数 ConnectionLeakProfileCount
                Integer connectionLeakProfileCount = getAttribute(
                        connectionPool, "ConnectionLeakProfileCount");
                // 连接池最大连接数 MaxCapacity
                Integer maxCapacity = getAttribute(connectionPool,
                        "StMaxCapacityate");

                System.out.println(name);
                System.out.println(poolName);
                System.out.println(state);
                System.out.println(activeConnectionsCurrentCount);
                System.out.println(highestNumWaiters);
                System.out.println(connectionLeakProfileCount);
                System.out.println(maxCapacity);

            }
        }

    }
}

/**
 * 执行队列运行时
 * 
 * @param serverRuntime
 * @throws AttributeNotFoundException
 * @throws InstanceNotFoundException
 * @throws MBeanException
 * @throws ReflectionException
 * @throws IOException
 */
public void getExecuteQueueRuntimes(ObjectName serverRuntime)
        throws AttributeNotFoundException, InstanceNotFoundException,
        MBeanException, ReflectionException, IOException {
    // 执行队列运行时 ExecuteQueueRuntimes
    ObjectName[] executeQueueRuntimes = getAttribute(serverRuntime,
            "ExecuteQueueRuntimes");
    for (int i = 0; i < executeQueueRuntimes.length; i++) {
        ObjectName executeQueueRuntime = executeQueueRuntimes[i];

        // 队列的名称 Name
        String name = getAttribute(executeQueueRuntime, "Name");
        // 执行线程的总数目 ExecuteThreadTotalCount
        Integer executeThreadTotalCount = getAttribute(executeQueueRuntime,
                "ExecuteThreadTotalCount");
        // 队列中当前空闲线程数 ExecuteThreadCurrentIdleCount
        Integer executeThreadCurrentIdleCount = getAttribute(
                executeQueueRuntime, "ExecuteThreadCurrentIdleCount");
        // 队列中最长的等待时间 PendingRequestOldestTime
        // 取出相应毫秒值
        Long pendingTime = getAttribute(executeQueueRuntime,
                "PendingRequestOldestTime");
        // 获取毫秒值对应的日期,并转换成指定格式
        Date pendingDate = new Date(pendingTime);
        String pendingRequestOldestTime = formatDate(pendingDate,
                "yyyy/MM/dd HH:mm:ss");
        // 队列中等待的请求数 PendingRequestCurrentCount
        Integer pendingRequestCurrentCount = getAttribute(
                executeQueueRuntime, "PendingRequestCurrentCount");
        // 被本队列处理的请求总数 ServicedRequestTotalCount
        Integer servicedRequestTotalCount = getAttribute(
                executeQueueRuntime, "ServicedRequestTotalCount");

        // TODO
        System.out.println(name);
        System.out.println(executeThreadTotalCount);
        System.out.println(executeThreadCurrentIdleCount);
        System.out.println(pendingRequestOldestTime);
        System.out.println(pendingRequestCurrentCount);
        System.out.println(servicedRequestTotalCount);
    }
}

/**
 * JDBC数据源运行时
 * 
 * @param serverRuntime
 * @throws AttributeNotFoundException
 * @throws InstanceNotFoundException
 * @throws MBeanException
 * @throws ReflectionException
 * @throws IOException
 */
public void getJDBCDataSourceRuntime(ObjectName serverRuntime)
        throws AttributeNotFoundException, InstanceNotFoundException,
        MBeanException, ReflectionException, IOException {
    // JDBC运行时 JDBCServiceRuntime
    ObjectName jdbcServiceRuntime = getAttribute(serverRuntime,
            "JDBCServiceRuntime");
    // TODO
    // System.out.println(getAttribute(
    // jdbcServiceRuntime, "Name"));
    // JDBC数据源运行时 JDBCDataSourceRuntimeMBeans
    ObjectName[] jdbcDataSourceRuntimeMBeans = getAttribute(
            jdbcServiceRuntime, "JDBCDataSourceRuntimeMBeans");

    for (int i = 0; i < jdbcDataSourceRuntimeMBeans.length; i++) {
        ObjectName jdbcDataSourceRuntimeMBean = jdbcDataSourceRuntimeMBeans[i];

        // 名称 Name
        String name = getAttribute(jdbcDataSourceRuntimeMBean, "Name");

        // // 返回当前等待连接的总数 WaitingForConnectionCurrentCount
        Integer waitingForConnectionCurrentCount = getAttribute(
                jdbcDataSourceRuntimeMBean,
                "WaitingForConnectionCurrentCount");
        // 重新连接失败计数 FailuresToReconnectCount
        Integer failuresToReconnectCount = getAttribute(
                jdbcDataSourceRuntimeMBean, "FailuresToReconnectCount");
        // 状态 State (Running,Suspended,Shutdown,Unhealthy,Unknown)
        String state = getAttribute(jdbcDataSourceRuntimeMBean, "State");
        // 泄漏的连接计数 LeakedConnectionCount
        Integer leakedConnectionCount = getAttribute(
                jdbcDataSourceRuntimeMBean, "LeakedConnectionCount");
        // 部署状态 DeploymentState
        Integer deploymentState = getAttribute(jdbcDataSourceRuntimeMBean,
                "DeploymentState");

         System.out.println(name);
         System.out.println(waitingForConnectionCurrentCount);
         System.out.println(failuresToReconnectCount);
         System.out.println(state);
         System.out.println(leakedConnectionCount);
         System.out.println(deploymentState);
         System.out.println();
    }

}

/**
 * JVM运行时
 * 
 * @param serverRuntime
 * @throws AttributeNotFoundException
 * @throws InstanceNotFoundException
 * @throws MBeanException
 * @throws ReflectionException
 * @throws IOException
 */
public void getJVMRuntime(ObjectName serverRuntime)
        throws AttributeNotFoundException, InstanceNotFoundException,
        MBeanException, ReflectionException, IOException {
    // JVM运行时 JVMRuntime
    ObjectName JVMRuntime = getAttribute(serverRuntime, "JVMRuntime");
    // 名称 Name
    String name = getAttribute(JVMRuntime, "Name");
    // 堆大小最大值 HeapSizeMax
    Long heapSizeMax = getAttribute(JVMRuntime, "HeapSizeMax");
    // 返回当前JVM堆中空闲内存数,单位时字节 HeapFreePercent
    Integer heapFreePercent = getAttribute(JVMRuntime, "HeapFreePercent");
    // 当前堆的总空间
    Long heapSizeCurrent = getAttribute(JVMRuntime, "HeapSizeCurrent");
    // 当前堆已使用的空间 HeapFreeCurrent
    Long heapFreeCurrent = getAttribute(JVMRuntime, "HeapFreeCurrent");
    getAttribute(JVMRuntime, "HeapFreeCurrent");

    // TODO
    // System.out.println(name);
    // System.out.println(byteToMB(heapSizeMax));
    // System.out.println(heapFreePercent);
    // System.out.println(byteToMB(heapSizeCurrent));
    // System.out.println(byteToMB(heapFreeCurrent));

}

/**
 * 服务器运行时
 * 
 * @param serverRuntime
 * @throws AttributeNotFoundException
 * @throws InstanceNotFoundException
 * @throws MBeanException
 * @throws ReflectionException
 * @throws IOException
 */
public void getServerRuntime(ObjectName serverRuntime)
        throws AttributeNotFoundException, InstanceNotFoundException,
        MBeanException, ReflectionException, IOException {

    // 服务名称 Name
    String name = getAttribute(serverRuntime, "Name");
    // 返回服务器激活时间ActivationTime
    Long activationTime = getAttribute(serverRuntime, "ActivationTime");

    Date date = new Date(activationTime);
    String time = formatDate(date, "yyyy/MM/dd HH:mm:ss");
    // 返回当前服务器监听连接的端口 ListenPort
    Integer listenPort = getAttribute(serverRuntime, "ListenPort");
    // 返回当前服务器监听连接的IP地址 ListenAddress
    String listenAddress = getAttribute(serverRuntime, "ListenAddress");
    // 状态 State
    String state = getAttribute(serverRuntime, "State");
    // 应用服务器的健康状态 HealthState
    HealthState healthState = (HealthState) connection.getAttribute(
            serverRuntime, "HealthState");
    // 当前打开的Socket数量 OpenSocketsCurrentCount
    Integer openSocketsCurrentCount = getAttribute(serverRuntime,
            "OpenSocketsCurrentCount");
    // 打开的Socket的总数 SocketsOpenedTotalCount
    Long socketsOpenedTotalCount = getAttribute(serverRuntime,
            "SocketsOpenedTotalCount");
    // 当前连接数 TODO


    System.out.println(healthState.getState());
    System.out.println(healthState.getMBeanName());
    System.out.println(healthState.getMBeanType());
    System.out.println(healthState.getSubsystemName());
    // TODO

// System.out.println(name);
// System.out.println(time);
// System.out.println(listenPort);
// System.out.println(listenAddress);
// System.out.println(state);
// System.out.println(healthState.getState());
// System.out.println(openSocketsCurrentCount);
// System.out.println(socketsOpenedTotalCount);

}

/**
 * web应用程序运行时组件
 * 
 * @param serverRuntime
 * @throws AttributeNotFoundException
 * @throws InstanceNotFoundException
 * @throws MBeanException
 * @throws ReflectionException
 * @throws IOException
 */
public void getWebAppComponentRuntime(ObjectName serverRuntime)
        throws AttributeNotFoundException, InstanceNotFoundException,
        MBeanException, ReflectionException, IOException {
    // 获取web应用程序运行时组件
    ObjectName[] applicationRuntimes = getAttribute(serverRuntime,
            "ApplicationRuntimes");
    for (int i = 0; i < applicationRuntimes.length; i++) {
        ObjectName applicationRuntime = applicationRuntimes[i];
        ObjectName[] componentRuntimes = getAttribute(applicationRuntime,
                "ComponentRuntimes");
        for (int j = 0; j < componentRuntimes.length; j++) {
            ObjectName componentRuntime = componentRuntimes[j];
            String componentType = getAttribute(componentRuntime, "Type");
            // web应用程序运行时组件 WebAppComponentRuntime
            if (componentType.equals("WebAppComponentRuntime")) {
                // 单元名 Name
                String name = getAttribute(componentRuntime, "Name");
                // 部署状态 DeploymentState
                Integer deploymentState = getAttribute(componentRuntime,
                        "DeploymentState");
                // 当前打开的Session数 OpenSessionsCurrentCount
                Integer openSessionsCurrentCount = getAttribute(
                        componentRuntime, "OpenSessionsCurrentCount");
                // Web应用程序名称
                // 打开的Session最高数 OpenSessionsHighCount
                Integer openSessionsHighCount = getAttribute(
                        componentRuntime, "OpenSessionsHighCount");
                // 打开的Session的总数 SessionsOpenedTotalCount
                Integer sessionsOpenedTotalCount = getAttribute(
                        componentRuntime, "SessionsOpenedTotalCount");
                // 应用状态 Status
                String status = getAttribute(componentRuntime, "Status");

                // TODO
                System.out.println("name = " + name + ", status = "
                        + deploymentState);
                System.out.println(openSessionsCurrentCount);
                System.out.println(openSessionsHighCount);
                System.out.println(sessionsOpenedTotalCount);
                System.out.println(status);
                System.out.println();
            }
        }
    }
}

/**
 * 线程池运行时
 * 
 * @throws IOException
 * @throws ReflectionException
 * @throws MBeanException
 * @throws InstanceNotFoundException
 * @throws AttributeNotFoundException
 */
public void getThreadPoolRuntime(ObjectName serverRuntime)
        throws AttributeNotFoundException, InstanceNotFoundException,
        MBeanException, ReflectionException, IOException {
    // 获取线程池运行时
    ObjectName threadPoolRuntime = getAttribute(serverRuntime,
            "ThreadPoolRuntime");
    // 暂停的 Suspended
    Boolean suspended = (Boolean) getAttribute(threadPoolRuntime,
            "Suspended");
    // 待处理用户请求计数 PendingUserRequestCount
    Integer pendingUserRequestCount = getAttribute(threadPoolRuntime,
            "PendingUserRequestCount");
    // 占用线程计数 HoggingThreadCount
    Integer hoggingThreadCount = getAttribute(threadPoolRuntime,
            "HoggingThreadCount");
    // 队列长度 QueueLength
    Integer queueLength = getAttribute(threadPoolRuntime, "QueueLength");

    System.out.println(suspended);
    System.out.println(pendingUserRequestCount);
    System.out.println(hoggingThreadCount);
    System.out.println(queueLength);
}

/**
 * 获取weblogic属性参数
 * 
 * @param objectName
 * @param name
 * @return
 */
@SuppressWarnings("unchecked")
public static <T> T getAttribute(ObjectName objectName, String name) {
    Object obj = null;
    try {
        obj = connection.getAttribute(objectName, name);
    } catch (Exception e) {
        // TODO
        e.printStackTrace();
    }
    return (T) obj;
}

/**
 * 日期格式转换
 * 
 * @param date
 * @param format
 * @return
 */
public static String formatDate(Date date, String format) {
    DateFormat df = new SimpleDateFormat(format);
    return df.format(date);
}

/**
 * 字节转换成MB
 * 
 * @param bytes
 * @return
 */
public static String byteToMB(long bytes) {
    double mb = (double) bytes / 1024 / 1024;
    DecimalFormat df = new DecimalFormat("#.00");
    return df.format(mb);
}

// TODO
public static void main(String[] args) throws Exception {
    JmxWeblogic weblogic = new JmxWeblogic();
    initConnection();

    ObjectName serverRuntime = getAttribute(runtimeService, "ServerRuntime");

    weblogic.getConnectorServiceRuntime(serverRuntime);
}

}


你好:
登录weblogic的控制台, http://xxx:7001/console, 有2个server 实例,
但是通过这段代码,获取到的 只有一个, 是哪里有问题吗?

谢谢二楼的回答,顶你哦