Package com.taobao.common.smonitor

Source Code of com.taobao.common.smonitor.SmonitorAdaptorServlet

package com.taobao.common.smonitor;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;



/**  
* @author xiaoxie  
* @create time��2010-4-6 ����06:06:24  
* @description 
*/
public class SmonitorAdaptorServlet extends HttpServlet {
  private static final String GBK = "GBK";
  private static final String YYYY_MM_DD = "'.'yyyy-MM-dd";
  private static final String M_N = "%d %m%n";

  private static Logger log = Logger.getLogger(SmonitorAdaptorServlet.class);
  private static Logger mbeanLog = Logger.getLogger("logMbean");

  private static final String DIR_NAME = "logs";
  private static final String FILE_NAME = "mbean.log";
  private static final String USER_HOME = "user.home";
 
  private static final String WRITETHREAD_NAME = "CORE_MONITOR";
  private static final long serialVersionUID = 1L;

  /** д�����ݵ��߳� */
  private static Thread writeThread = null;


  private static final ReentrantLock timerLock = new ReentrantLock();
  private static final Condition condition = timerLock.newCondition();
 
  /** ��־���ͣ�1�����ӳ� 2���̳߳� 3���ڴ� ��Ĭ�ϴ�ӡ���ӳغ��̳߳�*/
  private static String type = "1,2,3";
  /** ����Դ���˹ؼ��� �磺DB1DataSouce,DB2DataSouce */
  private static String dataSource;
  /** �̹߳��˹ؼ��� �磺ajp,http */
  private static String threadNameKeys;
  /** <p>
   * д�����ݵ�ʱ����.(ie.���ݲ���ʱ��)
   * </p>
   */
  private static long intervalTime = 20000L;
  public void init() throws ServletException {
    // ���� 1. db���ӳ� 2. �̳߳� 3. �ڴ�
    initParameter();
    final List<MonitorTask> monitorTasks = new ArrayList<MonitorTask>();
    initMonitorTasks(monitorTasks);
    // ����һ���߳���д�����Ϣ
    initWriter();
    if (null != writeThread) { // ����̻߳����ڣ���interruptһ��
      try {
        writeThread.interrupt();
      } catch (Exception e) {
        log.error("interrupt write thread error", e);
      }
    }
    // ��ʼ���߳�
    writeThread = new Thread(new Runnable() {
      public void run() {
        // �ȴ�waitTime��
        while (true) {
          timerLock.lock();
          try {
            condition.await(intervalTime, TimeUnit.MILLISECONDS);
          } catch (Exception e) {
            log.error("wait error", e);
          } finally {
            timerLock.unlock();
          }
          
          for (MonitorTask task : monitorTasks) {
            try {
              task.start();
            catch (java.lang.Throwable t) {
              log.error("task error" + task.getClass(), t);
            }
          }

        }
      }
    });
    writeThread.setName(WRITETHREAD_NAME);
    writeThread.start();
  }
  /**
   * @param monitorTasks
   */
  private void initMonitorTasks(final List<MonitorTask> monitorTasks) {
    if (type.indexOf('1') != -1) {
      if (dataSource != null && dataSource.length() > 0) {
        monitorTasks.add(new ConpoolMonitorTask(mbeanLog, dataSource.split(",")));
      } else {
        monitorTasks.add(new ConpoolMonitorTask(mbeanLog, null));
      }
    }
    if (type.indexOf('2') != -1) {
      ThreadPoolMonitorTask t = new ThreadPoolMonitorTask(mbeanLog, threadNameKeys);
     
      monitorTasks.add(t);
     
    }
    if (type.indexOf('3') != -1) {
      monitorTasks.add(new MemoryMonitorTask(mbeanLog));
    }
  }


  private void initParameter() {
    String initType = getInitParameter("type");
    if (initType != null) {
      type = initType;
    }
    String initintervalTime = getInitParameter("intervalTime");
    if (initintervalTime != null) {
      intervalTime = Long.parseLong(initintervalTime);
    }
    dataSource = getInitParameter("dataSource");
   
    threadNameKeys = getInitParameter("threadNameKeys");
  }




  private void initWriter() {
    PatternLayout layout = new PatternLayout(M_N);
    String userHome = System.getProperty(USER_HOME);
    if (!userHome.endsWith(File.separator)) {
      userHome += File.separator;
    }
    String path = userHome + DIR_NAME + File.separator;
    File dir = new File(path);
    if (!dir.exists()) {
      dir.mkdirs();
    }
    String fileName = path + FILE_NAME;
    FileAppender appender = null;
    try {
      appender = new DailyRollingFileAppender(layout, fileName, YYYY_MM_DD);
      appender.setAppend(true);
      appender.setEncoding(GBK);
    } catch (IOException e) {
      e.printStackTrace();
    }
    if (appender != null) {
      mbeanLog.removeAllAppenders();
      mbeanLog.addAppender(appender);
    }
    mbeanLog.setLevel(Level.INFO);
    mbeanLog.setAdditivity(false);
  }

 

  public void destroy() {
    if (null != writeThread) { // ����̻߳����ڣ���interruptһ��
      try {
        writeThread.interrupt();
      } catch (Exception e) {
        log.error("interrupt write thread error", e);
      }
    }
  }
 
}
TOP

Related Classes of com.taobao.common.smonitor.SmonitorAdaptorServlet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.