如何设计可手动终止及查看当前进度的任务

背景

 最近一个项目上有这么个功能:数据备份及恢复的任务,可手动终止,并可查看任务的当前执行进度。
 本篇的设计思想是通用的,只不过采用的是java语言实现

思考

暂且不谈数据备份及恢复如何实现,这里只是大概介绍下通用任务的实现

任务如何进行终止

所有的代码都是运行在一个线程中的,所以想办法终止正在运行中的线程就可以了.

具体的实现方式:定义一个开关变量来进行控制就可以了.

private volatile boolean on = true;
public void run(){
  while(on && hastNextDataToDeal()){
    //执行相关业务代码
  }
}

public void stop(){
  on = false;
}

如何查看获取当前的执行进度

  1. 获取总体的需要进行处理的记录数

    这里说的记录数是一个很泛的概念,比如数据备份这块,可以把它理解为数据库表的数量

  2. 每条记录处理完毕后,当前已处理的记录数+1

    按照数据库表来说,没处理过一次表的备份就相应的 + 1处理

//总的记录数
private volatile int totalRecords;
//当前已处理的记录数
private volatile int curDealedRecords;

public void run(){
  //获取待处理的总数
  int total = getTotalRecord();

  while(on && hastNextRecordToDeal()){
    //执行相关业务代码
    curDealedRecords++;
  }
}

总体设计

任务接口设计

具体的任务需实现此Task接口

public interface Task {

    /**
     * 任务运行的业务逻辑
     * @throws Exception
     */
    void run() throws Exception;

    /**
     * 获取总体的进度
     * @return
     */
    int getTotalProcess();

    /**
     * 获取当前的进度
     * @return
     */
    int getCurProcess();

    /**
     * 停止任务
     */
    void stop();
}

任务执行器设计

此任务执行器负责任务的调度,并可获取任务的执行信息

public interface TaskService {

    /**
     * 执行任务
     * @param task
     * @return 任务标识
     */
    String execute(Task task);

    /**
     * 获取任务信息
     * @param taskId
     * @return
     */
    TaskInfo getTaskInfo(String taskId);

    /**
     * 停止任务
     * @param taskId
     */
    boolean stop(String taskId);

    /**
     * 任务信息
     */
    public static class TaskInfo{
        /**
         * 任务的进度
         */
        private double process;

        /**
         * 开始时间
         */
        private Date startTime;

        /**
         * 结束时间
         */
        private Date endTime;
    }
}

/**
** 任务执行器的大概实现
**/
public class DefaultTaskService implements TaskService {

    /**
     * 任务执行线程池
     */
    private ThreadPoolExecutor threadPoolExecutor;

    /**
     * 定时调度器
     */
    private ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;

    @Override
    public String execute(Task task) {
        String taskId = null; // 生成任务唯一标识
        //执行任务
        threadPoolExecutor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    task.run();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        //定时调度获取任务信息
        scheduledThreadPoolExecutor.schedule(new TaskInfoUpdateTask(), 1, TimeUnit.SECONDS);
        return taskId;
    }

    @Override
    public TaskInfo getTaskInfo(String taskId) {
        return null;
    }

    @Override
    public boolean stop(String taskId) {
        return false;
    }
}

至此整体的后台实现就已基本完成了,前端到时只需根据任务唯一标识去查询任务执行信息就可以了



如何设计可手动终止及查看当前进度的任务

原文地址:https://www.cnblogs.com/zhengqun/p/12208763.html

时间: 2024-11-11 02:08:36

如何设计可手动终止及查看当前进度的任务的相关文章

DG查看恢复进度

查看恢复进度 (1)查看进程的活动状态 V$MANAGED_STANDBY视图专用于显示物理Standby数据库相关进程的当前状态,该视图中的列也很有特点,查看进程状态时,通常我们会关注PROCESS.CLIENT_PROCESS.SEQUENC#和STATUS几列,例如: SQL> SELECT PROCESS,CLIENT_PROCESS,SEQUENCE#, STATUS FROM V$MANAGED_STANDBY; 相关说明: PROCESS:进程名称,如ARCH.RFS.MRP0等.

安装kali 开机登陆 Ping 主机可达 Ctrl+c键来强行终止 ifconfig 查看网络状态 创建一个用户,并将其纳入root组,然后将用户删除 创建用户, 创建文件夹,文件夹中创建一些文件,将文件夹打包,最后解包到另一个文件中 创建一个文件。

安装linus操作系统 直接按回车确定 Live(amd64),就可以直接自动安装进入操作系统 安装完成后,进入界面. 创建用户zfh,密码123456 将用户zfh删除 利用ifconfig查看网络状态 创建zfh17文件夹,在文件夹里面创建17.txt,和18.txt. 利用rm,删除17.txt 利用ps-ef显示进程 查看磁盘容量 显示目录中所有文件的大小 在zfh200里面创建两个文件夹zfh201和zfh202,将zfh201压缩到zfh202中 解压缩 windows操作系统命令使

SQLServer 查看备份进度

SELECT   DB_NAME(er.[database_id]) [DatabaseName],  er.[command] AS [CommandType],  er.[percent_complete],  er.start_time,CONVERT(DECIMAL(5, 2), er.[percent_complete]) AS [Complete_Percent]  ,CONVERT(DECIMAL(38, 2), er.[total_elapsed_time] / 60000.00

查看,控制进程

程序:程序是保存在外部存储介质(如硬盘)中的可执行代码和数据的静态集合 进程:进程是运行在CPU及内存中出于动态执行状态的计算机程序,每个程序启动后可以创建多个进程 例如web,大量用户同时访问是,httpd服务会创建多个进程来提供服务 1.查看进程 (1.ps命令:查看静态的进程统计信息(ProcessesStatistic) a:显示当前终端下的所有进程,包括其他用户的进程,与x选项结合是将显示系统中左右的进程信息 u:使用以用户为主的格式输出进程信息 x:显示当前用户所有终端下的进程信息

ios开发:一个音乐播放器的设计与实现

github地址:https://github.com/wzpziyi1/MusicPlauer 这个medo,关于歌曲播放的主要功能都实现了的.下一曲.上一曲,暂停,根据歌曲的播放进度动态滚动歌词,将当前正在播放的歌词放大显示,拖动进度条,歌曲跟着变化,并且使用Time Profiler进行了优化,还使用XCTest对几个主要的类进行了单元测试. 已经经过真机调试,在真机上可以后台播放音乐,并且锁屏时,显示一些主要的歌曲信息. 首页: 歌曲内部播放: 当拖动小的进度条的时候,歌曲也会随之变化.

软件设计要素初探:架构模式

在 "软件设计要素初探" 一文,尝试从软件设计的整体角度,综合讨论了软件设计的各种要素.本文探讨系统组件交互的架构模式. 架构模式是系统组件及组件交互的模式,决定了处理数据和领域对象的全局控制结构.组件化是使用架构模式的前提. 可参阅 <面向模式的软件架构>了解更多架构模式. 分层模式 分层模式: 将应用划分为多个层次,定义各层的接口.任务抽象及消息格式,以及各层之间的通信与交互.业务系统通常会划分为业务逻辑层.服务层.领域层.数据层.网络栈协议是分层模式的典型应用.应用分

nginx 服务器启动、终止、重启

启动 在linux系统下输入命令: nginx地址 -c nginx配置文件 就可启动nginx eg:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 终止 Linux查看nginx进程号: ps -ef|grep nginx 找到master分支上的 进程号:2195 然后执行停止命令 从容停止: 快速停止:    强制停止: 重启 重启之前,如果修改了配置文件需要检查下配置文件 检查命令: 如果配置无误: 或者

Vantage.Plant.Design.Management.System.v12.1.SP2-ISO 1DVD 简称PDMS,著名的3D工厂设计管理系统

Vantage.Plant.Design.Management.System.v12.1.SP2-ISO 1DVD 简称PDMS,著名的3D工厂设计管理系统(Plant Design Management System) 是一种3D工厂设计系统.在PDMS中.多个专业组可以协同设计以建立一个详细的 3D数字工厂模型.每个设计者在设计过程中都可以随时查.1.负责PDMS的数据库建立.维护.及软件的使用和软件的推广培训 2.负责软件系统维护和升级 3.对分公司进行必要的指导和支持 4.负责项目数据的

BI之SSAS完整实战教程7 -- 设计维度、细化维度中 :浏览维度,细化维度

上篇文章我们已经将Dim Geography维度设计好. 若要查看维度的成员, AS需要接收该维度的详细信息(包括已创建的特性.成员属性以及多级层次结构), 通过XMLA与AS的实例进行通信. 今天我们将维度部署到AS上进行查看. 文章提纲 补充背景知识 浏览维度,细化维度 总结 补充背景知识 XMLA是一种基于简单对象访问协议(SOAP)的XML应用程序编程接口的行业标准, 设计用于OLAP和数据挖掘. XMLA规范定义了两个函数,即Execute和Discover, 这两个函数用于向主机实例