package com.cwa.log.task; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; /** * * @author * @descirption 抽象的计划任务服务器 */ public abstract class AbstractTaskService { private static final Logger logger=Logger.getLogger(AbstractTaskService.class); /** 当前服务包含的所有任务回调的列表 **/ protected List<TaskCallbackHandler> handlerList=new CopyOnWriteArrayList<TaskCallbackHandler>(); /** * 添加周期计划任务 * @param task * @return */ public TaskCallbackHandler scheduleAtFixedRate(Task task){ ScheduledFuture<?> future=getExecutor().scheduleAtFixedRate(new TaskRunnable(task), getDelay(), getPeriod(), TimeUnit.MILLISECONDS); TaskCallbackHandler handler=new TaskCallbackHandler(task,future,this); handlerList.add(handler); return handler; } /** * 添加周期计划任务 * @param task * @param delay * @return */ public TaskCallbackHandler scheduleAtFixedRate(Task task,long delay){ ScheduledFuture<?> future=getExecutor().scheduleAtFixedRate(new TaskRunnable(task), delay, getPeriod(), TimeUnit.MILLISECONDS); TaskCallbackHandler handler=new TaskCallbackHandler(task,future,this); handlerList.add(handler); return handler; } /** * 添加周期计划任务 * @param task * @param delay * @param period * @return */ public TaskCallbackHandler scheduleAtFixedRate(Task task,long delay,long period){ ScheduledFuture<?> future=getExecutor().scheduleAtFixedRate(new TaskRunnable(task),delay, period, TimeUnit.MILLISECONDS); TaskCallbackHandler handler=new TaskCallbackHandler(task,future,this); handlerList.add(handler); return handler; } /** * 一次性的计划任务 * @param task * @param delay * @param period * @return */ public TaskCallbackHandler scheduleOnceTask(Task task,long delay){ ScheduledFuture<?> future=getExecutor().schedule(new TaskRunnable(task),delay,TimeUnit.MILLISECONDS); TaskCallbackHandler handler=new TaskCallbackHandler(task,future,this); handlerList.add(handler); return handler; } /** * 移除指定的Handler * @param handler */ public void removeHandler(TaskCallbackHandler handler){ handlerList.remove(handler); } /** * 统一运行计划任务 */ public void info(){ if(logger.isInfoEnabled()) logger.info("【"+getName()+"】执行线程数量,Core="+getExecutor().getCorePoolSize()+",active="+getExecutor().getActiveCount()+",completeNum="+getExecutor().getCompletedTaskCount()+",taskNum="+handlerList.size()); } /** * 执行停止的方法 */ public void shutDown(){ for(TaskCallbackHandler handler:handlerList){ handler.cancel(); } logger.error("停止任务服务器"); } /** * 获取系统具体的执行器 * @return * ScheduledExecutorService * */ protected abstract ScheduledThreadPoolExecutor getExecutor(); /** * 获取执行周期 * @return */ protected abstract long getPeriod(); /** * 获取默认延时周期 * @return */ protected abstract long getDelay(); /** * 返回当前服务的名称 * @return */ protected abstract String getName(); }