Package com.dianping.cat.config.aggregation

Source Code of com.dianping.cat.config.aggregation.AggregationConfigManager$ConfigReloadTask

package com.dianping.cat.config.aggregation;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.unidal.dal.jdbc.DalException;
import org.unidal.dal.jdbc.DalNotFoundException;
import org.unidal.helper.Files;
import org.unidal.helper.Threads;
import org.unidal.helper.Threads.Task;
import org.unidal.lookup.annotation.Inject;
import org.xml.sax.SAXException;

import com.dianping.cat.Cat;
import com.dianping.cat.configuration.aggreation.model.entity.Aggregation;
import com.dianping.cat.configuration.aggreation.model.entity.AggregationRule;
import com.dianping.cat.configuration.aggreation.model.transform.DefaultSaxParser;
import com.dianping.cat.core.config.Config;
import com.dianping.cat.core.config.ConfigDao;
import com.dianping.cat.core.config.ConfigEntity;

public class AggregationConfigManager implements Initializable {
  @Inject
  protected ConfigDao m_configDao;

  @Inject
  protected AggregationHandler m_handler;

  private int m_configId;

  private static final String CONFIG_NAME = "aggreationConfig";

  private Aggregation m_aggregation;

  private long m_modifyTime;

  public static final int PROBLEM_TYPE = 3;

  public boolean deleteAggregationRule(String rule) {
    m_aggregation.removeAggregationRule(rule);
    m_handler.register(queryAggregationRules());
    return storeConfig();
  }

  public String handle(int type, String domain, String status) {
    return m_handler.handle(type, domain, status);
  }

  @Override
  public void initialize() {
    try {
      Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
      String content = config.getContent();

      m_configId = config.getId();
      m_aggregation = DefaultSaxParser.parse(content);
      m_modifyTime = config.getModifyDate().getTime();
    } catch (DalNotFoundException e) {
      try {
        String content = Files.forIO().readFrom(
              this.getClass().getResourceAsStream("/config/default-aggregation-config.xml"), "utf-8");
        Config config = m_configDao.createLocal();

        config.setName(CONFIG_NAME);
        config.setContent(content);
        m_configDao.insert(config);
        m_configId = config.getId();
        m_aggregation = DefaultSaxParser.parse(content);
      } catch (Exception ex) {
        Cat.logError(ex);
      }
    } catch (Exception e) {
      Cat.logError(e);
    }
    if (m_aggregation == null) {
      m_aggregation = new Aggregation();
    }
    m_handler.register(queryAggregationRules());

    Threads.forGroup("cat").start(new ConfigReloadTask());
  }

  public boolean insertAggregationRule(AggregationRule rule) {
    m_aggregation.addAggregationRule(rule);
    m_handler.register(queryAggregationRules());
    return storeConfig();
  }

  public List<AggregationRule> queryAggrarationRulesFromDB() {
    try {
      m_aggregation = queryAggreation();

      return new ArrayList<AggregationRule>(m_aggregation.getAggregationRules().values());
    } catch (Exception e) {
      Cat.logError(e);
    }
    return new ArrayList<AggregationRule>();
  }

  public AggregationRule queryAggration(String key) {
    return m_aggregation.findAggregationRule(key);
  }

  private Aggregation queryAggreation() {
    try {
      Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
      String content = config.getContent();

      return DefaultSaxParser.parse(content);
    } catch (Exception e) {
      Cat.logError(e);
    }
    return new Aggregation();
  }

  public List<AggregationRule> queryAggregationRules() {
    return new ArrayList<AggregationRule>(m_aggregation.getAggregationRules().values());
  }

  public void refreshAggreationConfig() throws DalException, SAXException, IOException {
    Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
    long modifyTime = config.getModifyDate().getTime();

    synchronized (this) {
      if (modifyTime > m_modifyTime) {
        String content = config.getContent();
        Aggregation aggregation = DefaultSaxParser.parse(content);

        m_aggregation = aggregation;
        m_handler.register(queryAggregationRules());
        m_modifyTime = modifyTime;
      }
    }
  }

  public void refreshRule() {
    List<AggregationRule> rules = queryAggrarationRulesFromDB();

    m_handler.register(rules);
  }

  private boolean storeConfig() {
    try {
      Config config = m_configDao.createLocal();

      config.setId(m_configId);
      config.setKeyId(m_configId);
      config.setName(CONFIG_NAME);
      config.setContent(m_aggregation.toString());
      m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL);
    } catch (Exception e) {
      Cat.logError(e);
      return false;
    }
    return true;
  }
 
  public class ConfigReloadTask implements Task {

    @Override
    public String getName() {
      return "Aggreation-Config-Reload";
    }

    @Override
    public void run() {
      boolean active = true;
      while (active) {
        try {
          refreshAggreationConfig();
        } catch (Exception e) {
          Cat.logError(e);
        }
        try {
          Thread.sleep(60 * 1000L);
        } catch (InterruptedException e) {
          active = false;
        }
      }
    }

    @Override
    public void shutdown() {
    }
  }

}
TOP

Related Classes of com.dianping.cat.config.aggregation.AggregationConfigManager$ConfigReloadTask

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.