这个自动任务调度系统的来由是这样的:前段时间,在一个 Java 技术群中,看到一个网友发了一个消息,说:自己在面试中,遇到编写一个具体的自动任务调度系统。并把面试中的那个任务调度系统的需求发到了群中。当时,感觉没有头绪,就没怎么想了。后来感觉吧,还挺有意思的,于是就分析了一下,大致完成了需求中的要求。可能内容比较长,我把提纲先列了出来:
(1)面试中,具体的项目要求
那位朋友,在面试中,遇到的自动任务调度系统的需求是这样的:
【设计一个自动任务调度系统需求:
1. 有三种类型的任务,分别为查询任务、提交任务、同步任务。每种类型任务都有自己的处理方式。
一个任务生成线程,每秒钟生成个5任务,每个任务类型是随机选择的三种任务之一。
1) 查询任务职责:打印“查询任务”+执行到第几条。
2) 提交任务职责:打印“提交任务”+执行到第几条,并暂停5秒钟。
3) 同步任务职责:在执行时,每执行三个任务,成功2个,失败一个(抛RuntimeException).
失败的任务必须在规定的时间后被重新执行,只在第三次执行这个任务时成功。
成功执行的任务,打印“同步任务”+执行到第几条。
2. 任务需要并发执行
3. 任务执行成功,设置任务状态为成功,记录成功时间。
4. 如果任务执行失败,需要根据每种任务类型配置的重试间隔时间重新执行,并记录失败原因。
5. 允许使用的线程数最少5个,最多不超过10个线程。
6. 执行成功的任务不能再次执行。】
(2)自己根据需求做的分析
根据上面的需求,我画了用例图和类图
(2.1)用例图如下:
我将其大致分为两个部分:生成线程和执行线程,复杂的就是执行线程。
(2.2)类图如下:
我从需求中的信息中,抽离出了任务类(Task)、任务类型枚举(TaskTypeEnum)、线程池(ThreadPool)和操作线程类(GenerateThread),在操作线程类中,存在生成线程的方法和执行线程的方法,在执行过程中,任务的执行状态都保存在任务类(Task)的属性中。
(3)分析后,具体的编程实现
具体的类如下:
(3.1)TaskTypeEnum 枚举
1 /** 2 * 0.0.0.1 3 */ 4 package com.auto.system; 5 6 import java.util.Random; 7 8 /** 9 * 任务类型的枚举 10 * @author 高青 11 * 2014-5-20 12 */ 13 public enum TaskTypeEnum { 14 SELECT("查询任务"), COMMIT("提交任务"), TOGETHER("同步任务"); 15 16 /** 中文名称 */ 17 private String CN_NAME; 18 19 private TaskTypeEnum(){ 20 } 21 22 /** 23 * 随机得到任务类型 24 * @author 高青 25 * 2014-6-10 26 * @return TaskTypeEnum 任务类型枚举类对象 27 */ 28 public static TaskTypeEnum getRandomTaskTypeEnum(){ 29 //使用随机数判断 30 Random random = new Random(); 31 32 switch (random.nextInt(3)) { 33 case 0: 34 return TaskTypeEnum.SELECT; 35 case 1: 36 return TaskTypeEnum.COMMIT; 37 default: 38 return TaskTypeEnum.TOGETHER; 39 } 40 } 41 42 private TaskTypeEnum(String cn_name){ 43 this.CN_NAME = cn_name; 44 } 45 46 public String toString(){ 47 return CN_NAME; 48 } 49 }