1.定义任务
/** * 表示一个任务 * */ public interface Task { /** * 运行实际的任务内容 * * @throws Exception */ public void runTask() throws Exception; /** * 返回Task的信息 * @return */ public TaskInfo getTaskInfo(); /** * 准备参数信息 * @param args * @throws Exception */ void initTaskInfo(String[] args); }
2.任务信息
/** * 表示一个任务的信息 * */ public class TaskInfo { private String taskName; // 参数列表 private Map<String, String> arguments = new HashMap<String, String>(); public TaskInfo() { } public TaskInfo(String taskName) { this.taskName = taskName; } public String getTaskName() { return taskName; } public void setTaskName(String taskName) { this.taskName = taskName; } public void addArgument(String argName, String argValue) { arguments.put(argName, argValue); } public String getArgument(String argName) { return arguments.get(argName); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(taskName); if (arguments.size() > 0) { for (Entry<String, String> arg : arguments.entrySet()) { sb.append('[').append(arg.getKey()).append('=').append(arg.getValue()).append(']'); } } return sb.toString(); } }
3.任务实现support类。
/** * 任务support * */ public abstract class TaskSupport implements Task { protected TaskInfo taskInfo; @Override public void initTaskInfo(String[] args) { if (args.length == 0) { return; } taskInfo = new TaskInfo(args[0]); // 初如化参数列表 for (int i = 1; i < args.length; i++) { String[] argPair = args[i].split("="); if (initArg(argPair[0], argPair[1])) { taskInfo.addArgument(argPair[0], argPair[1]); } else { Log.warn("Argument ignored: " + args[i]); } } } protected boolean initArg(String name, String value) { return false; } @Override public TaskInfo getTaskInfo() { return taskInfo; } @Override final public void runTask() throws Exception { initTask(); try { doRunTask(); } finally { afterRunTask(); } } /** * 真正处理task的 */ abstract protected void doRunTask() throws Exception; /** * 用于收尾工作,如资源的释放等等 */ protected void afterRunTask() throws Exception { } /** * 初始化task中的一些信息 */ protected void initTask() throws Exception { } }
4.任务运行入口
/** * 所有task的启动类 * * */ public class TaskRunner { private static final Log log = LogFactory.getLog(TaskRunner.class); public static void main(String[] args) { Task task = prepareTask(args); if (task == null) { return; } try { log.info("Start running task: " + task.getTaskInfo()); task.runTask(); log.info("Finish running task: " + task.getTaskInfo()); } catch (Exception e) { log.error("Error running Task: " + task.getTaskInfo(), e); } } public static Task prepareTask(String[] args) { String[] beanFiles = new String[] { "*.xml", "*.xml","*.xml"}; ApplicationContext context = new ClassPathXmlApplicationContext(beanFiles); Map<String, Task> tasks = context.getBeansOfType(Task.class); if (args.length < 1 || !tasks.containsKey(args[0])) { log.error("No such task: " + args[0]); log.info(getTaskListStr(tasks)); return null; } Task task = tasks.get(args[0]); task.initTaskInfo(args); return task; } private static String getTaskListStr(Map<String, Task> tasks) { StringBuilder sb = new StringBuilder("All available tasks: "); for (String taskName : tasks.keySet()) { sb.append(taskName).append(','); } return sb.toString(); } }