ScheduleMaster在上个月底更新到了2.0版本,在功能和代码以及文档上都往前跨了很大一步,详细信息可以参考这篇文章:https://www.cnblogs.com/hohoa/p/12772945.html

对ScheduleMaster还不熟悉的朋友可以先移步作者的系列文章:https://www.cnblogs.com/hohoa/category/1628282.html

这次的更新点主要包含:

  • 开发了延时任务功能。

  • 抽象出分布式锁服务并默认数据库实现。

  • 补充了单元测试。

  • 补充了几篇文档。

  • 修复了已知的bug。

其中的重头戏自然是延时任务功能,所谓的延时任务就是在指定时刻执行指定逻辑,这在平时需求开发中是非常常见的,作为一款功能齐全的调度系统这当然也是必备的功能。

关于延时任务的实现原理我早期写过一篇文章《采用简易的环形延时队列处理秒级定时任务的解决方案》来介绍,ScheduleMaster也是在这个基础上改进而来。

当然了,其他的实现方式也还有很多,主流的实现方案可以参考下面这篇文章,整理的比较齐全:https://www.cnblogs.com/vipstone/p/12696465.html

我采用的就是比较经典的时间轮算法,原理就不再重复介绍了可以移步到我前面的文章,下面看看实现效果。

实现了什么效果

我们先通过一段测试代码看看延时队列的运行情况:

 [Fact]
public void Run()
{
//初始化容器
DelayPlanManager.Init();
Debug.WriteLine($"延时队列初始化完成时间:{DateTime.Now}"); Func<DelayQueueSlot, Task> callback = (result) =>
{
var np = result as NotifyPlan;
//模拟业务
Debug.WriteLine($"[{DateTime.Now}]ID:{np.Key},地址:{np.NotifyUrl},延迟秒数:{np.TimeSpan}"); return Task.CompletedTask;
}; //模拟生产端写入任务
Task[] tasks = new Task[10];
for (int i = 0; i < 10; i++)
{
tasks[i] = new Task(() =>
{
for (int k = 0; k < 200; k++)
{
int rndNum = new Random().Next(20, 500);
DelayPlanManager.Insert(new NotifyPlan
{
NotifyUrl = "http://localhost:56655/api/1.0/value/delaypost",
Key = Guid.NewGuid().ToString(),
Callback = callback
}, DateTime.Now.AddSeconds(rndNum));
}
}, TaskCreationOptions.LongRunning);
tasks[i].Start();
}
Task.WaitAll(tasks); //构造消费者
while (true)
{
DelayPlanManager.Read();
System.Threading.Thread.Sleep(1000);
}
}

代码中创建了2000个延时任务,延时范围在20秒至500秒,所以我们预测在程序启动后最快20秒就开始有信息输出,程序调式结果为:

当一个周期执行完后刚好过了1分钟:

分秒不差。

先睹为快

再看看在项目中的实际应用。

控制台创建任务页面:

不过实际使用中通过API方式创建显然更符合需求,所以一如既往地提供了开放API供业务系统接入,详细使用方式参考官方文档【使用API接入任务】。

系统提供了2种延迟模式供选择,即相对时间绝对时间,可以在系统参数中配置,默认是使用相对时间。但使用相对时间模式有一点要注意,各节点间可能存在系统时间差导致任务被多次执行,所以业务做好幂等性控制至关重要。

延时任务管理页面:



这里解释下任务的各个状态

  • 已作废,表示已经从执行计划移除

  • 已创建,表示刚创建好还没有加入执行计划

  • 已就绪,表示已加入到执行计划中等待执行

  • 已完成,表示执行成功

  • 异常,表示执行失败

继续看一下任务运行情况。

单节点执行成功:

异常重试效果:

可用的参数配置:

更多好玩的东西欢迎下载体验~

写在最后

喜欢的朋友请来一波star支持,并持续关注~~

传送门:

ScheduleMaster新特性之延时任务初体验的更多相关文章

  1. Java 8 新特性之 Stream 流基础体验

    Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...

  2. 【Python3爬虫】爬取美女图新姿势--Redis分布式爬虫初体验

    一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...

  3. Java高级特性1_流库_初体验

    Java高级特性流库_初体验 面对结果编程 在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下 面向过程编程 面向过程编程需要编程程序让程序依次执行得到自己想要的结 ...

  4. [Android 新特性] 谷歌发布Android Studio开发工具1.0正式版(组图) 2014-12-09 09:35:40

    Android Studio是谷歌于13年I/O大会推出的Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的Androi ...

  5. Python 3.8.0 正式版发布,新特性初体验 全面介绍

    Python 3.8.0 正式版发布,新特性初体验 北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PE ...

  6. Python 3.8.0 正式版发布,新特性初体验

    北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PEP 572: Assignment Expressi ...

  7. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  8. vue 3.0 体验,vue 3.0新特性

    前言 昨天不是尤雨溪 不是刚在B站 直播玩了,分享了vue-next v3.0.0-beta.1 版本 哈哈, 不要太刺激哦 6大亮点 Performance:性能更比Vue 2.0强. Tree s ...

  9. 使用 HTML5 History 新特性增强 Ajax 的体验(转)

    一. 场景再现 如大家熟知,Ajax 可以实现页面的无刷新操作,但会造成两个与普通页面操作(有刷新地改变页面)有着明显差别的问题—— URL 没有修改以及无法使用前进.后退按钮.例如常见的 Ajax ...

随机推荐

  1. Java中集合的初等案例

    我有五个学生,请把这个学生的信息储存到数组中,并遍历数组,获取得到每一个学生信息. 学生:Strdent 成员变量:name,age 构造方法:无参,带参 成员方法:getXxx()/setXxx() ...

  2. 【Django 2.2文档系列】Model 外键中的on_delete参数用法

    场景 我们用Django的Model时,有时候需要关联外键.关联外键时,参数:on_delete的几个配置选项到底是干嘛的呢,你知道吗? 参数介绍 models.CASCADE 级联删除.Django ...

  3. SQLI-LABS学习笔记(一)

    逼话少说,如有错误,烦请指出,谢谢. 第一关 提示传个id的参数 后面跟个单引号 http://10.2.10.31/sqli/Less-1/?id=1’ 发现报错,这里看到是已经闭合了 You ha ...

  4. latex-列表环境

    介绍 latex 主要有三种列表环境,进行罗列的实现, 无序列表 -- itemize 有序列表 -- enumerate 描述列表 -- description 本文进行了一一介绍和演示, 同时添加 ...

  5. 基于jenkins自动打包并部署docker环境

    一.实验环境 git                      192.168.200.71 jenkins    192.168.200.72 docker               192.16 ...

  6. 【Python】在Pycharm中安装爬虫库requests , BeautifulSoup , lxml 的解决方法

    BeautifulSoup在学习Python过程中可能需要用到一些爬虫库 例如:requests BeautifulSoup和lxml库 前面的两个库,用Pychram都可以通过 File--> ...

  7. 【java基础】01 计算机基础知识

    一.计算机基础知识 1. 计算机 1. 什么是计算机? 计算机在生活中的应用举例 计算机(Computer)全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设 ...

  8. 【Linux题目】第九关

    前言:项目整合 企业项目实战考试: 1. 全网备份解决方案实战 2. NFS集群后段共享存储搭建优化 3. 解决NFS单点实现实时数据同步. 环境: 服务器角色 外网ip 内网ip 主机名 web 1 ...

  9. Python3 字符串格式化(%操作符)

    格式符 格式符为真实值预留位置,并控制显示的格式.格式符可以包含有一个类型码,用以控制显示的类型,如下: %s    字符串 (采用str()的显示) %r    字符串 (采用repr()的显示) ...

  10. Django 内置分页的简单使用

    1, 文档 https://docs.djangoproject.com/en/1.11.1/topics/pagination/ 2,视图 from django.core.paginator im ...