关于网站建设的书,wordpress 数据库 清理,企业咨询服务公司经营范围,免费咨询服务合同模板下载通用批次任务模板
我们总会遇到需要使用批次任务处理问题的场景#xff0c;任务有很多不同类型的任务#xff0c;同时这些任务可能都有大致相同#xff0c;甚至抽象出来共同的执行阶段状态。 任务的执行肯定无法保证一帆风顺#xff0c;总会在某个时间阶段被打断#xff…通用批次任务模板
我们总会遇到需要使用批次任务处理问题的场景任务有很多不同类型的任务同时这些任务可能都有大致相同甚至抽象出来共同的执行阶段状态。 任务的执行肯定无法保证一帆风顺总会在某个时间阶段被打断这个时候我们需要设计一个可以断点重续的任务下面则通过模板模式实现一个这样的通用流程
任务类-Task
可以通过实现它自定义自己的任务类对应不同的任务比如扫地任务、洗碗任务
public interface Task {String getType();TaskStatus getStatus();void setStatus(TaskStatus status);void startExcute();void runExcute();void pauseExcute();void endExcute();
}任务状态枚举-TaskStatus
public enum TaskStatus {START,RUNNING, PAUSED, COMPLETED,FAILED
}
具体任务
public class ConcreteTask1 implements Task {private String type;private TaskStatus status;public ConcreteTask1(String type, TaskStatus taskStatus) {this.type type;this.status taskStatus;}Overridepublic String getType() {return type;}Overridepublic TaskStatus getStatus() {return status;}Overridepublic void setStatus(TaskStatus status) {this.status status;}public void startExcute() {System.out.println(任务类型: type ,阶段-开始);// 更新任务状态setStatus(TaskStatus.START);runExcute();}public void runExcute() {System.out.println(任务类型: type ,阶段-执行中);// 更新任务状态setStatus(TaskStatus.RUNNING);pauseExcute();}public void pauseExcute() {System.out.println(任务类型: type ,阶段-重启则可继续...);// 更新任务状态setStatus(TaskStatus.PAUSED);endExcute();}public void endExcute() {System.out.println(任务类型: type ,阶段-结束);// 更新任务状态setStatus(TaskStatus.COMPLETED);}
}任务处理类-TaskProcessor
可以在这里定义任务执行入口传入你的任务类。 入口方法中可以增加各个阶段状态的判断逻辑以便梳理执行顺序是断点重续的关键
public interface TaskProcessor {void process(Task task);
}
通用模板
通用模板定义一些必须的方法或者流程
public class ConcreteTaskManager extends TaskManagerTemplate {public ConcreteTaskManager(int maxThreads) {super(maxThreads);}Overrideprotected void handleTaskError(Task task, Exception e) {// 具体处理任务错误的逻辑System.out.println(Error handling for task: task.getType());}
}具体任务模板实现
public abstract class TaskManagerTemplate {private ExecutorService executorService;public TaskManagerTemplate(int maxThreads) {executorService Executors.newFixedThreadPool(maxThreads);}public void executeTasks(ListTask tasks, TaskProcessor taskProcessor) {for (Task task : tasks) {executorService.execute(() - {// 执行通用任务处理流程try {taskProcessor.process(task);task.setStatus(TaskStatus.COMPLETED);} catch (Exception e) {// 处理任务执行异常task.setStatus(TaskStatus.PAUSED);handleTaskError(task, e);}});}shutdown();}public void shutdown() {executorService.shutdown();}// 留给子类实现的处理任务错误的方法protected abstract void handleTaskError(Task task, Exception e);
}测试类
认真看看
public class TemplateTask {public static void main(String[] args) {// 创建具体任务管理器指定最大线程数ConcreteTaskManager taskManager new ConcreteTaskManager(4);// 从数据库加载任务数据ListTask tasks loadTasksFromDatabase();// 创建任务处理器TaskProcessor taskProcessor new TaskProcessor() {Overridepublic void process(Task task) {// 任务执行逻辑if (task.getStatus() TaskStatus.START) {task.startExcute();task.setStatus(TaskStatus.START);} else if (task.getStatus() TaskStatus.RUNNING) {task.runExcute();task.setStatus(TaskStatus.RUNNING);} else if (task.getStatus() TaskStatus.PAUSED) {task.pauseExcute();task.setStatus(TaskStatus.PAUSED);} else if (task.getStatus() TaskStatus.COMPLETED) {task.endExcute();task.setStatus(TaskStatus.COMPLETED);} else {System.out.println(执行失败);task.setStatus(TaskStatus.FAILED);}}};// 提交任务到任务管理器taskManager.executeTasks(tasks, taskProcessor);}private static ListTask loadTasksFromDatabase() {// 从数据库中加载任务数据包括类型和状态// 返回任务列表// 这里简化为手动创建任务列表ListTask tasks new ArrayList();tasks.add(new ConcreteTask1(Type1, TaskStatus.START));tasks.add(new ConcreteTask1(Type2, TaskStatus.RUNNING));tasks.add(new ConcreteTask1(Type3, TaskStatus.PAUSED));tasks.add(new ConcreteTask1(Type4, TaskStatus.COMPLETED));// 添加其他任务return tasks;}
}