/* * (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; } }