通用任务批次程序模板

news/2024/10/22 17:18:14/

通用批次任务模板

我们总会遇到需要使用批次任务处理问题的场景,任务有很多不同类型的任务,同时这些任务可能都有大致相同,甚至抽象出来共同的执行阶段状态。
任务的执行肯定无法保证一帆风顺,总会在某个时间阶段被打断,这个时候我们需要设计一个可以断点重续的任务,下面则通过模板模式实现一个这样的通用流程:

任务类-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(List<Task> 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);// 从数据库加载任务数据List<Task> 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 List<Task> loadTasksFromDatabase() {// 从数据库中加载任务数据,包括类型和状态// 返回任务列表// 这里简化为手动创建任务列表List<Task> 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;}
}

http://www.ppmy.cn/news/1145363.html

相关文章

vue部分入门知识点代码示例

1. Vue实例 Vue.js的核心是Vue实例&#xff0c;用来管理你的应用。以下是一个创建Vue实例的示例&#xff1a; <!DOCTYPE html> <html> <head><title>Vue.js入门示例</title><!-- 引入Vue.js库 --><script src"https://cdn.jsdel…

【【萌新的SOC学习之AXI接口简介】】

萌新的SOC学习之AXI接口简介 AXI总线的初步介绍 AXI 总线是 ARM AMBA 一部分 &#xff08;高级可扩展接口&#xff09; AMBA(高级微控制器总线架构&#xff09; &#xff1a;开放的片内互联的总线标准&#xff0c;能再多主机设计中实现多个控制器和外围设备之间的连接和管理。…

本地计算机端口显示CLOSE_WAIT、TIME_WAIT、ESTABLISHED、三种情况的区别

本地计算机端口显示 “CLOSE_WAIT”、“TIME_WAIT” 和 “ESTABLISHED” 表示不同的TCP连接状态&#xff0c;它们之间的区别如下&#xff1a; CLOSE_WAIT&#xff08;关闭等待&#xff09;&#xff1a; 在此状态下&#xff0c;本地计算机已经接收到来自远程计算机的关闭请求&am…

【Android】点击短信链接唤起APP的方案实践

一.概述 在很多业务场景中&#xff0c;需要点击短信链接跳转到App的指定页面。在Android系统中&#xff0c;想要实现这个功能&#xff0c;可以通过DeepLink或AppLink实现。 二.方案 1.DeepLink DeepLink是Android系统最基础、最普遍、最广泛的外部唤起App的方式&#xff0c;不…

17基于matlab卡尔曼滤波的行人跟踪算法,并给出算法估计误差结果,判断算法的跟踪精确性,程序已调通,可直接运行,基于MATLAB平台,可直接拍下。

17基于matlab卡尔曼滤波的行人跟踪算法&#xff0c;并给出算法估计误差结果&#xff0c;判断算法的跟踪精确性&#xff0c;程序已调通&#xff0c;可直接运行&#xff0c;基于MATLAB平台&#xff0c;可直接拍下。 17matlab卡尔曼滤波行人跟踪 (xiaohongshu.com)

虚拟桌宠模拟器:VPet-Simulator,一个开源的桌宠软件, 可以内置到任何WPF应用程序

虚拟桌宠模拟器&#xff1a;VPet-Simulator&#xff0c;一个开源的桌宠软件, 可以内置到任何WPF应用程序 虚拟桌宠模拟器 一个开源的桌宠软件, 可以内置到任何WPF应用程序 获取虚拟桌宠模拟器 OnSteam(免费) 或 通过[Nuget]内置到你的WPF应用程序 1.虚拟桌宠模拟器 详细介绍 …

java项目实现不停服更新的4种方案(InsCode AI 创作助手)

文章目录 1. Blue-Green 部署2. 滚动更新3. 使用负载均衡器4. 灰度发布 在软件开发和维护中&#xff0c;不停机更新是确保应用程序持续可用的关键任务之一。以下是四种常见的不停机更新策略及其示例&#xff1a; 1. Blue-Green 部署 概念&#xff1a; Blue-Green 部署是一种部…

接口(interface)

接口&#xff08;interface&#xff09; 概述 接口就是规范&#xff0c;定义一组规则&#xff0c;体现了现实世界中“如果你是/要…则必须能…”的思想。继承是一个“是不是”的is-a关系&#xff0c;而接口实现则是“能不能”的has-a关系 1.接口的理解&#xff1a;接口的本质…