zoukankan      html  css  js  c++  java
  • NETCore Bootstrap Admin 通用后台管理权限 [3]: 精简版任务调度模块

    前言

    NETCore 里说到任务调度,大家首先想到的应该是大名鼎鼎的 QuartzNET 与 Hangfire,然而本篇介绍的却都不是,而是 Bootstrap Admin(以下简称 BA)通用后台权限管理框架中内置的一个小功能任务调度模块。

    为什么重复造轮子

    我个人认为这不是重复造轮子,只有自己写过调度才能对 调度 有深刻的体会,能对很多平时未涉及的知识进行巩固与学习,通过 Tasks 模块的编写对多线程、异步等知识点都能更深入的了解与实践。

    Task 组件介绍

    组件同时支持 .net framework 4.5+ 以及 .net standard 2.0 netcoreapp 3.0 netcoreapp 3.1

    用法介绍

    NETCore 容器注入

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTaskServices();
    }
    

    NETFramework 4.5+

    // 程序入口调用
    TaskServicesManager.Init();
    

    例子

    默认任务 (立即执行,仅执行一次)

    TaskServicesManager.GetOrAdd("简单任务1", token => Console.WriteLine("Hello world"));
    TaskServicesManager.GetOrAdd("简单任务2", token => Console.WriteLine("Hello world"), TriggerBuilder.Default.Build());
    

    周期性任务 (1 分钟后间隔 5 秒执行2次任务)

    // 1 分钟后间隔 5 秒执行2次任务
    var trigger = TriggerBuilder.Default.WithInterval(TimeSpan.FromSeconds(5)).WithRepeatCount(2).WithStartTime(DateTimeOffset.Now.AddMinutes(1)).Build(); 
    TaskServicesManager.GetOrAdd("周期任务", token => Console.WriteLine("Hello world"), trigger);
    

    Cron表达式任务

    Cron 格式说明
    cron 表达式是用于定义固定时间、日期和间隔的掩码。掩码由秒(可选)、分钟、小时、日、月和星期字段组成。所有字段都允许指定多个值,如果所有字段都包含匹配的值,则任何给定的日期/时间都将满足指定的 cron 表达式。

                                           Allowed values    Allowed special characters   Comment
    
    ┌───────────── second (optional)       0-59              * , - /                      
    │ ┌───────────── minute                0-59              * , - /                      
    │ │ ┌───────────── hour                0-23              * , - /                      
    │ │ │ ┌───────────── day of month      1-31              * , - / L W ?                
    │ │ │ │ ┌───────────── month           1-12 or JAN-DEC   * , - /                      
    │ │ │ │ │ ┌───────────── day of week   0-6  or SUN-SAT   * , - / # L ?                Both 0 and 7 means SUN
    │ │ │ │ │ │
    * * * * * *
    
    // 每秒钟执行一次任务
    TaskServicesManager.GetOrAdd("表达式任务", token => Console.WriteLine("Hello world"), TriggerBuilder.Build(Cron.Secondly()));
    
    // 每分钟执行一次任务
    TaskServicesManager.GetOrAdd("表达式任务", token => Console.WriteLine("Hello world"), TriggerBuilder.Build(Cron.Minutely()));
    
    // 间隔 5 秒循环执行任务
    TaskServicesManager.GetOrAdd("表达式任务", token => Console.WriteLine("Hello world"), TriggerBuilder.Build("*/5 * * * * *"));
    
    // 每分钟的第 5 秒循环执行任务
    TaskServicesManager.GetOrAdd("表达式任务", token => Console.WriteLine("Hello world"), TriggerBuilder.Build("5 * * * * *"));
    

    通过上面的简单介绍可以看出来这个 Task 组件要比 QuartzNET 与 Hangfire 简单太多太多了,再来个稍微复杂一点点的。

    /// <summary>
    /// 后台任务实现类
    /// </summary>
    public class FooTask : ITask
    {
        /// <summary>
        /// 后台任务具体业务操作
        /// </summary>
        public async Task Execute(CancellationToken cancellationToken)
        {
            // 模拟任务执行耗时500毫秒
            try
            {
                await Task.Delay(500, cancellationToken);
            }
            catch (TaskCanceledException) { }
            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }
            // do something ...
        }
    }
    

    调用代码

    // 可以根据自己的实际需要,更改 Trigger 实例
    TaskServicesManager.GetOrAdd<FooTask>();
    

    是不是任务调度非常简单?代码量很少很少?

    实战

    上图为 Bootstrap Admin 后台管理平台内的任务管理实时输出页面,每间隔 5 秒钟,屏幕更新一条记录,底层使用 signalR 进行的消息推送 链接地址

    码云项目地址:https://gitee.com/LongbowEnterprise/BootstrapAdmin
    演示网站地址:https://ba.sdgxgz.com
    任务管理地址:https://ba.sdgxgz.com/Admin/Tasks

    NETCore Bootstrap Admin 通用后台管理权限 [1]: 前后台分离权限管理系统介绍
    NETCore Bootstrap Admin 通用后台管理权限 [2]: Blazor 版本介绍
    NETCore Bootstrap Admin 通用后台管理权限 [3]: 精简版任务调度模块

  • 相关阅读:
    Debian vim没有颜色的解决办法
    第四次作业
    第三次作业
    第二次作业
    Mad Libs游戏 & 华氏温度与摄氏温度转换
    有趣故事
    Mybatis的使用及增删改查
    jdbc数据连接池
    详解MySQL数据类型
    SQL语法大全
  • 原文地址:https://www.cnblogs.com/argozhang/p/12046445.html
Copyright © 2011-2022 走看看