package com.taobao.zeus.socket.master;
import java.util.Comparator;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.util.internal.ConcurrentHashMap;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import com.taobao.zeus.model.HostGroupCache;
import com.taobao.zeus.mvc.Dispatcher;
import com.taobao.zeus.schedule.mvc.ScheduleInfoLog;
import com.taobao.zeus.store.DebugHistoryManager;
import com.taobao.zeus.store.FileManager;
import com.taobao.zeus.store.GroupManager;
import com.taobao.zeus.store.GroupManagerOld;
import com.taobao.zeus.store.JobHistoryManager;
import com.taobao.zeus.store.ProfileManager;
import com.taobao.zeus.store.HostGroupManager;
public class MasterContext {
private static Logger log = LoggerFactory.getLogger(MasterContext.class);
private Map<Channel, MasterWorkerHolder> workers=new ConcurrentHashMap<Channel, MasterWorkerHolder>();
private ApplicationContext applicationContext;
private Master master;
private Scheduler scheduler;
private Dispatcher dispatcher;
private Map<String,HostGroupCache> hostGroupCache;
//调度任务 jobId
// private Queue<JobElement> queue=new ArrayBlockingQueue<JobElement>(10000);
private Queue<JobElement> queue=new PriorityBlockingQueue<JobElement>(10000, new Comparator<JobElement>() {
public int compare(JobElement je1, JobElement je2) {
int numbera = je1.getPriorityLevel();
int numberb = je2.getPriorityLevel();
if (numberb > numbera) {
return 1;
} else if (numberb < numbera) {
return -1;
} else {
return 0;
}
}
});
private Queue<JobElement> exceptionQueue = new LinkedBlockingQueue<JobElement>();
//调试任务 debugId
private Queue<JobElement> debugQueue=new ArrayBlockingQueue<JobElement>(1000);
//手动任务 historyId
private Queue<JobElement> manualQueue=new ArrayBlockingQueue<JobElement>(1000);
// private Queue<JobElement> manualQueue=new PriorityBlockingQueue<JobElement>(1000, new Comparator<JobElement>() {
// public int compare(JobElement je1, JobElement je2) {
// int numbera = je1.getPriorityLevel();
// int numberb = je2.getPriorityLevel();
// if (numberb > numbera) {
// return 1;
// } else if (numberb < numbera) {
// return -1;
// } else {
// return 0;
// }
// }
// });
private MasterHandler handler;
private MasterServer server;
private ExecutorService threadPool=Executors.newCachedThreadPool();
private ScheduledExecutorService schedulePool=Executors.newScheduledThreadPool(12);
public MasterContext(ApplicationContext applicationContext){
this.applicationContext=applicationContext;
}
public void init(int port){
log.info("init begin");
try {
StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
stdSchedulerFactory.initialize("zeusQuartz.properties");
scheduler = stdSchedulerFactory.getScheduler();
scheduler.start();
} catch (SchedulerException e) {
ScheduleInfoLog.error("schedule start fail", e);
}
dispatcher=new Dispatcher();
handler=new MasterHandler(this);
server=new MasterServer(handler);
server.start(port);
master=new Master(this);
log.info("init finish");
}
public void destory(){
threadPool.shutdown();
schedulePool.shutdown();
if(server!=null){
server.shutdown();
}
if(scheduler!=null){
try {
scheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
ScheduleInfoLog.info("destory finish");
}
public Map<Channel, MasterWorkerHolder> getWorkers() {
return workers;
}
public void setWorkers(Map<Channel, MasterWorkerHolder> workers) {
this.workers = workers;
}
public Scheduler getScheduler() {
return scheduler;
}
public void setScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
}
public Dispatcher getDispatcher() {
return dispatcher;
}
public void setDispatcher(Dispatcher dispatcher) {
this.dispatcher = dispatcher;
}
public HostGroupManager getHostGroupManager(){
return (HostGroupManager) applicationContext.getBean("hostGroupManager");
}
public JobHistoryManager getJobHistoryManager() {
return (JobHistoryManager) applicationContext.getBean("jobHistoryManager");
}
public DebugHistoryManager getDebugHistoryManager(){
return (DebugHistoryManager)applicationContext.getBean("debugHistoryManager");
}
public FileManager getFileManager(){
return (FileManager) applicationContext.getBean("fileManager");
}
public ProfileManager getProfileManager(){
return (ProfileManager) applicationContext.getBean("profileManager");
}
public Queue<JobElement> getQueue() {
return queue;
}
public void setQueue(Queue<JobElement> queue) {
this.queue = queue;
}
public GroupManager getGroupManager() {
return (GroupManager) applicationContext.getBean("groupManager");
}
public GroupManagerOld getGroupManagerOld() {
return (GroupManagerOld) applicationContext.getBean("groupManagerOld");
}
public MasterHandler getHandler() {
return handler;
}
public void setHandler(MasterHandler handler) {
this.handler = handler;
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
public MasterServer getServer() {
return server;
}
public void setServer(MasterServer server) {
this.server = server;
}
public ExecutorService getThreadPool() {
return threadPool;
}
public Master getMaster() {
return master;
}
public void setMaster(Master master) {
this.master = master;
}
public ScheduledExecutorService getSchedulePool() {
return schedulePool;
}
public Queue<JobElement> getDebugQueue() {
return debugQueue;
}
public void setDebugQueue(Queue<JobElement> debugQueue) {
this.debugQueue = debugQueue;
}
public Queue<JobElement> getManualQueue() {
return manualQueue;
}
public synchronized void refreshHostGroupCache(){
try {
hostGroupCache = getHostGroupManager().getAllHostGroupInfomations();
} catch (Exception e) {
ScheduleInfoLog.error("refresh hostgroupcache error", e);
}
}
public synchronized Map<String,HostGroupCache> getHostGroupCache() {
return hostGroupCache;
}
public Queue<JobElement> getExceptionQueue() {
return exceptionQueue;
}
}