当前位置: 首页 > news >正文

通用任务批次程序模板

通用批次任务模板

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

任务类-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;}
}

相关文章:

通用任务批次程序模板

通用批次任务模板 我们总会遇到需要使用批次任务处理问题的场景&#xff0c;任务有很多不同类型的任务&#xff0c;同时这些任务可能都有大致相同&#xff0c;甚至抽象出来共同的执行阶段状态。 任务的执行肯定无法保证一帆风顺&#xff0c;总会在某个时间阶段被打断&#xff…...

Rust专属开发工具——RustRover发布

JetBrains最近推出的Rust集成开发工具——RustRover已经发布&#xff0c;官方网站&#xff1a;RustRover: Rust IDE by JetBrains JetBrains出品过很受欢迎的开发工具IntelliJ IDEA、PyCharm等。 RustRover优势 Rust集成环境&#xff0c;根据向导可自动下载安装rust开发环境提…...

数据结构:链表(1)

顺序表的优缺点 缺点&#xff1a; 1.插入数据必须移动其他数据&#xff0c;最坏情况下&#xff0c;就是插入到0位置。时间复杂度O(N) 2.删除数据必须移动其他数据&#xff0c;最坏情况下&#xff0c;就是删除0位置。时间复杂度O(N) 3.扩容之后&#xff0c;有可能会浪费空间…...

软件测试之概念篇2(瀑布模型、螺旋模型、增量模型和迭代模型、敏捷模型,V模型、W模型)

目录 开发模型 &#xff08;1&#xff09;瀑布模型 &#xff08;2&#xff09;螺旋模型 &#xff08;3&#xff09;增量模型和迭代模型 &#xff08;4&#xff09;敏捷模型 &#xff08;5&#xff09;测试模型&#xff08;V模型、W模型&#xff09; V模型 W模型 开发模型…...

【【萌新的SOC学习之重新起航SOC】】

萌新的SOC学习之重新起航SOC ZYNQ PL 部分等价于 Xilinx 7 系列 FPGA PS端&#xff1a;Zynq 实际上是一个以处理器为核心的系统&#xff0c;PL 部分可以看作是它的一个外设。 我们可以通过使用AXI(Advanced eXtensible Interface)接口的方式调用 IP 核&#xff0c;系统通过 AX…...

ElasticSearch 学习7 集成ik分词器

网上找了一大堆&#xff0c;很多都介绍的不详细&#xff0c;开始安装完一直报错找不到plugin-descriptor.properties&#xff0c;有些懵这个东西不应该带在里面吗&#xff0c;参考了一篇博客说新建一个这个&#xff0c;新建完可以启动&#xff0c;但是插入索引数据会报错找不到…...

[NewStarCTF 2023 公开赛道] week1

最近没什么正式比赛&#xff0c;都是入门赛&#xff0c;有moectf,newstar,SHCTF,0xGame都是漫长的比赛。一周一堆制。 这周newstar第1周结束了&#xff0c;据说py得很厉害&#xff0c;第2周延期了&#xff0c;什么时候开始还不一定&#xff0c;不过第一周已经结束提交了&#…...

ThreeJS-3D教学六-物体位移旋转

之前文章其实也有涉及到这方面的内容&#xff0c;比如在ThreeJS-3D教学三&#xff1a;平移缩放物体沿轨迹运动这篇中&#xff0c;通过获取轨迹点物体动起来&#xff0c;其它几篇文章也有旋转的效果&#xff0c;本篇我们来详细看下&#xff0c;另外加了tween.js知识点&#xff0…...

BC v1.2充电规范

1 JEITA Reference to https://www.mianbaoban.cn/blog/post/169964 符合 JEITA 规范的锂离子电池充电器解决方案 2 Battery Fuel Gauge 2.1 Cycle Count&#xff08;充放电循环次数&#xff09; 此指令回传一只读字段&#xff0c;代表电芯组已经历的完整充放电循环数。当放电容…...

判断一个整数是否回文

回文数字的定义&#xff1a;第一位和最后一位相等&#xff0c;第二位和倒数第二位相等...依次类推&#xff0c;比如1221,12321等等&#xff0c;也就是说一个数字如果是回文&#xff0c;那么将它反转之后&#xff0c;一定和原来的值相等 解法一&#xff1a;投机取巧&#xff0c…...

【广州华锐互动】车辆零部件检修AR远程指导系统有效提高维修效率和准确性

在快速发展的科技时代&#xff0c;我们的生活和工作方式正在被重新定义。这种变化在许多领域都有所体现&#xff0c;尤其是在汽车维修行业。近年来&#xff0c;AR&#xff08;增强现实&#xff09;技术的进步为这个行业带来了前所未有的可能性。通过将AR技术与远程协助系统相结…...

简单实现接口自动化测试(基于python+unittest)

简介 本文通过从Postman获取基本的接口测试Code简单的接口测试入手&#xff0c;一步步调整优化接口调用&#xff0c;以及增加基本的结果判断&#xff0c;讲解Python自带的Unittest框架调用&#xff0c;期望各位可以通过本文对接口自动化测试有一个大致的了解。 引言 为什么要…...

【算法|双指针系列No.4】leetcode11. 盛最多水的容器

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…...

数据结构全集介绍

以下列举了部分常见的数据结构&#xff1a; 数组&#xff08;Array&#xff09;&#xff1a;数组是一种线性数据结构&#xff0c;可以用来存储固定大小的数据集合。在数组中&#xff0c;每个元素都有一个对应的索引&#xff0c;可以通过索引直接访问和更新元素。数组的优点是访…...

力扣刷题-字符串-反转字符串

344 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中…...

【CCNP】第七章 动态路由协议-BGP

第一节 BGP的基本概念 BGP&#xff08;Border Gateway Protocol&#xff09;&#xff0c;边界网关协议 是运行在网络和网络之间的协议&#xff0c;是一款EGP&#xff08;外部网关协议&#xff09; BGP基于TCP协议工作&#xff0c;目的端口号179。源端口随机&#xff0c;由路由…...

java学习--day24(stream流)

文章目录 今天的内容1.Stream【难点】1.1获取流的对象1.2Stream流对象下面1.2.1count和forEach1.2.2filter方法1.2.3limit1.2.4map方法1.2.5skip1.2.6concat 1.3收集流 1.基于接口和抽象类的匿名内部类的写法 abstract class Person {public abstract void eat(); } public sta…...

Multi-Grade Deep Learning for Partial Differential Equations

论文阅读&#xff1a;Multi-Grade Deep Learning for Partial Differential Equations with Applications to the Burgers Equation Multi-Grade Deep Learning for Partial Differential Equations with Applications to the Burgers Equation符号定义偏微分方程定义FNN定义PI…...

Docker部署rustdesk

查看镜像版本 https://hub.docker.com/r/rustdesk/rustdesk-server/tags 拉取镜像 docker pull rustdesk/rustdesk-server:1.1.8-2创建挂载目录 mkdir -p /opt/rustdesk/{hbbr,hbbs}/root运行hbbs –nethost 仅适用于 Linux&#xff0c;它让 hbbs/hbbr 可以看到对方真实的…...

win1011安装MG-SOFT+MIB+Browser+v10b

文章目录 安装MG-SOFTSNMP服务配置安装MG-SOFT启动MIB-Browser以及错误解决MIB Browser使用 安装MG-SOFT win10和win11安装基本一样&#xff0c;所以参照下面的操作即可&#xff01; SNMP服务配置 打开设置&#xff0c;应用和功能&#xff0c;可选功能&#xff0c;选择添加功…...

Simics在网络转型与SDN迁移中的核心价值与应用

1. Simics在网络转型与SDN迁移中的核心价值解析网络架构正经历从传统硬件设备向软件定义网络(SDN)和网络功能虚拟化(NFV)的深刻变革。这场变革的核心挑战在于&#xff1a;如何在保持网络高性能的同时&#xff0c;实现控制平面与数据平面的解耦&#xff0c;以及如何将传统网络功…...

CM201-1-CH刷机避坑指南:S905L3B+UWE5621DS芯片组合刷机时,为什么必须取消‘擦除flash’?

CM201-1-CH刷机避坑指南&#xff1a;S905L3BUWE5621DS芯片组合的特殊性解析 每次刷机操作都像一场精密手术&#xff0c;而CM201-1-CH这款搭载S905L3B主控与UWE5621DS无线芯片组合的机顶盒&#xff0c;则像一位"特殊体质"的患者——常规操作可能导致不可逆的"医疗…...

Boss-Key终极指南:Windows窗口隐藏与隐私保护完整解决方案

Boss-Key终极指南&#xff1a;Windows窗口隐藏与隐私保护完整解决方案 【免费下载链接】Boss-Key 老板来了&#xff1f;快用Boss-Key老板键一键隐藏静音当前窗口&#xff01;上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在数字化办公环境中…...

开源安全工具openclaw-killer:Nginx Lua环境威胁检测与防护实践

1. 项目概述&#xff1a;一个开源安全工具的诞生与使命最近在安全研究圈子里&#xff0c;一个名为openclaw-killer的项目引起了我的注意。这个由nkzprod维护的开源工具&#xff0c;名字就透着一股“杀气”——“OpenClaw杀手”。乍一看&#xff0c;你可能会以为这是某个游戏外挂…...

Python 代码优化:核心技巧与模式

Python 代码优化&#xff1a;核心技巧与模式 1. 技术分析 1.1 代码优化原则 代码优化需要遵循以下原则&#xff1a; 优化原则先测量后优化: 避免盲目优化保持可读性: 不要为了性能牺牲代码质量优先算法优化: 算法层面的优化效果最显著考虑空间换时间: 合理使用缓存1.2 常见性能…...

商场中庭防火玻璃挡烟垂壁 耐火阻燃防烟专用

在大型商业综合体、商场中庭等人员密集的公共建筑场景中&#xff0c;消防防排烟系统是保障建筑安全、满足消防验收规范的核心配置&#xff0c;防火玻璃挡烟垂壁作为关键的挡烟分隔构件&#xff0c;凭借稳定的性能与美观的适配性&#xff0c;成为当下商业建筑消防工程的优选产品…...

从零构建生产级AI助手:OpenClaw配置实战与自动化工作流指南

1. 项目概述&#xff1a;从零到一&#xff0c;构建你的生产级AI助手工作空间如果你和我一样&#xff0c;已经厌倦了每次配置AI助手时&#xff0c;都要从零开始摸索各种配置文件、脚本和最佳实践&#xff0c;那么这个名为openclaw-config的项目&#xff0c;绝对是你梦寐以求的“…...

从数据云到ArcGIS:一站式掌握DEM影像的获取、拼接与裁剪实战

1. DEM影像基础与数据源选择 数字高程模型&#xff08;DEM&#xff09;是地理信息系统中描述地表形态的基础数据&#xff0c;广泛应用于地形分析、水文模拟、工程建设等领域。对于刚接触GIS的朋友来说&#xff0c;最常见的困惑就是&#xff1a;从哪里获取DEM数据&#xff1f;不…...

5分钟实现PNG/JPG到SVG的终极转换:vectorizer矢量化工具完全指南

5分钟实现PNG/JPG到SVG的终极转换&#xff1a;vectorizer矢量化工具完全指南 【免费下载链接】vectorizer Potrace based multi-colored raster to vector tracer. Inputs PNG/JPG returns SVG 项目地址: https://gitcode.com/gh_mirrors/ve/vectorizer vectorizer是一个…...

Windows外接显示器亮度控制终极指南:使用Twinkle Tray轻松解决Windows系统限制

Windows外接显示器亮度控制终极指南&#xff1a;使用Twinkle Tray轻松解决Windows系统限制 【免费下载链接】twinkle-tray Easily manage the brightness of your monitors in Windows from the system tray 项目地址: https://gitcode.com/gh_mirrors/tw/twinkle-tray …...