Package com.taobao.metamorphosis.tools.monitor.core

Source Code of com.taobao.metamorphosis.tools.monitor.core.CoreManager

/*
* (C) 2007-2012 Alibaba Group Holding Limited.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* Authors:
*   wuhua <wq163@163.com> , boyan <killme2008@gmail.com>
*/
package com.taobao.metamorphosis.tools.monitor.core;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;

import org.apache.log4j.Logger;

import com.taobao.metamorphosis.exception.MetaClientException;
import com.taobao.metamorphosis.tools.domain.MetaServer;
import com.taobao.metamorphosis.tools.monitor.InitException;


/**
* @author �޻�
* @since 2011-5-27 ����03:28:14
*/

public class CoreManager {

    private static Logger logger = Logger.getLogger(CoreManager.class);

    private static CoreManager instance;

    private MsgSender[] senders;
    private MsgReceiver[] reveicers;
    private volatile MonitorConfig monitorConfig;
    private final ScheduledThreadPoolExecutor proberExecutor;


    private CoreManager(final MonitorConfig monitorConfig, int coreSize) throws InitException {
        this.monitorConfig = monitorConfig;
        List<MetaServer> metaServerList = this.monitorConfig.getMetaServerList();
        if (metaServerList == null || metaServerList.isEmpty()) {
            throw new InitException("serverUrls����Ϊ��");
        }

        this.proberExecutor = new ScheduledThreadPoolExecutor(coreSize);

        logger.info("init senders and receivers...");
        this.initSenderReceiver();
        monitorConfig.addPropertyChangeListener("serverUrlList", new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent evt) {
                logger.info("�������б����仯");
                CoreManager.this.proberExecutor.setCorePoolSize(monitorConfig.getMetaServerList().size() * 2);
                try {
                    CoreManager.this.reInitSenderReceiver();
                    logger.info("���³�ʼ����ض���ɹ�");
                }
                catch (Exception e) {
                    logger.error("���³�ʼ����ض���ʧ��!", e);
                }

            }
        });
    }


    synchronized private void reInitSenderReceiver() throws InitException {
        if (this.senders != null) {
            for (MsgSender sender : this.senders) {
                if (sender != null) {
                    sender.dispose();
                    sender = null;
                }
            }
            this.senders = null;
        }
        if (this.reveicers != null) {
            for (MsgReceiver reveicer : this.reveicers) {
                if (reveicer != null) {
                    reveicer.dispose();
                    reveicer = null;
                }
            }
            this.reveicers = null;
        }
        this.initSenderReceiver();
    }


    synchronized private void initSenderReceiver() throws InitException {

        List<MetaServer> metaServerList = this.monitorConfig.getMetaServerList();
        Collections.sort(metaServerList);
        this.senders = new MsgSender[metaServerList.size()];
        this.reveicers = new MsgReceiver[metaServerList.size()];
        try {
            for (int i = 0; i < metaServerList.size(); i++) {
                logger.info("init for:" + metaServerList.get(i));
                this.senders[i] = new MsgSender(metaServerList.get(i).getUrl(), "0", this.monitorConfig);

                this.reveicers[i] = new MsgReceiver(metaServerList.get(i).getUrl(), this.monitorConfig);
            }
        }
        catch (MetaClientException e) {
            throw new InitException("init Senders and Receivers fail", e);
        }
    }


    synchronized public static CoreManager getInstance(MonitorConfig monitorConfig, int coreSize) throws InitException {
        /** ���ﲻ��Ƶ�����ö��,�򻯴���,��������ͬ���� **/
        return instance == null ? (instance = new CoreManager(monitorConfig, coreSize)) : instance;
    }


    public MsgSender[] getSenders() {
        return this.senders;
    }


    public MsgSender getSender(String serverUrl) {
        for (MsgSender sender : this.senders) {
            if (sender.getServerUrl().contains(serverUrl)) {
                return sender;
            }
        }
        return null;
    }


    MsgReceiver[] getReveicers() {
        return this.reveicers;
    }


    public MonitorConfig getMonitorConfig() {
        return this.monitorConfig;
    }


    public ScheduledThreadPoolExecutor getProberExecutor() {
        return this.proberExecutor;
    }

}
TOP

Related Classes of com.taobao.metamorphosis.tools.monitor.core.CoreManager

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.