定时调度插件------Longbow.Tasks
使用说明
dll引用
使用NuGet 搜索Longbow.Task可找到相关版本的dll
目前最新的为7.0.0版本,需net6.0+
如果低版本用户可使用5.2.1
直接下载源码编译即可
dll引入程序
- .netcore 容器注入
services.AddTaskServices();
- donet4.5+ 使用
// 程序入口调用
TaskServicesManager.Init();
自定义业务实现(Job)
自定义业务类
/// <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 ...
}
}
将自定义业务类添加到程序中
// 1.将FooTask添加,默认使用内部的触发器
TaskServicesManager.GetOrAdd<FooTask>().Task.Execute(default);
// 2.设置触发器Cron
// 每分钟的第 5 秒循环执行任务
TaskServicesManager.GetOrAdd<FooTask>("表达式任务", token => Task.Delay(1000), TriggerBuilder.Build("5 * * * * *"));
测例代码说明
CronTest测例
DateTimeOffset 与DateTime的不同:多存储了时区
通过Cron类来获得下次执行的时间
var now = DateTimeOffset.Now;
// 1.当前时间加5s与后者相等
// Cron.Secondly():返回Cron的string
// ParseCronExpression(): 将string转换为CronExpression
// GetNextExecution:通过参数的时间来获得下次执行的时间
Assert.Equal(now.AddSeconds(5), Cron.Secondly(5).ParseCronExpression().GetNextExecution(now));
// 2.每 2 秒 执行一次
var cron = "*/2 * * * * *".ParseCronExpression();
// 获取一个一分钟之内的任务列表
var nextRuntimes = cron.GetOccurrences(now, now.AddMinutes(1), TimeZoneInfo.Local).Take(3).ToList();
// 每个任务间隔时间为2s
Assert.Equal(nextRuntimes[0].AddSeconds(2), nextRuntimes[1]);
Assert.Equal(nextRuntimes[1].AddSeconds(2), nextRuntimes[2]);
// 3.cron必须按照时间规格来设置,不能超过
DictionaryTest测例
// ConcurrentDictionary进行AddOrUpdate时,如果内部使用了并发代码,需要使用懒加载模式
var tasks = Enumerable.Range(1, 5).Select(i => Task.Run(() =>
{
var temp = pool.AddOrUpdate("Test", key => new Lazy<string>(() =>
{
var t = GenerateValue(i); //返回的为Task<string>
t.Wait();
return t.Result;
}), (key, value) => new Lazy<string>(() =>
{
var t = UpdateValue(i); //返回的为Task<string>
t.Wait();
return t.Result;
}));
}));
ScheduleTaskTest测例
// 1.CancellationTokenSource的WaitOne方法
var cts = new CancellationTokenSource();
// 返回false表示2s已经过去,任务未结束
Assert.False(cts.Token.WaitHandle.WaitOne(2000));
// 1s后结束任务
cts.CancelAfter(1000);
// 返回true,表示2s内任务已经结束
Assert.True(cts.Token.WaitHandle.WaitOne(2000));
// 2.TriggerBuilder触发器
// 每秒执行一次,无超时时间,从当前时间开始,第三个参数可为空,表示当前时间
TriggerBuilder.Build(Cron.Secondly(), -1, DateTimeOffset.Now);
// 创建当前时间的触发器
TriggerBuilder.Default.WithStartTime().Build();
// 以1000毫秒为周期的触发器
TriggerBuilder.Default.WithInterval(1000).Build();
// 设置超时时间为1s,第二个参数不设置则为Timeout.InfiniteTimeSpan
TriggerBuilder.Build(Cron.Secondly(), 1000);
TaskManagerTest测例
// 1.开始任务
// Foo2Task重载ExecutableTask方法并实现ConfigureStartInfo接口
// Command和Argumens为命令行的相关参数
var sche = TaskServicesManager.GetOrAdd<Foo2Task>();
await Task.Delay(300);
// 执行
await sche.Task.Execute(default);
// 2.触发器执行后的回调函数
sche.Triggers.First().PulseCallback = t =>{};
TaskStorageTest测例
// 1.当持久化以后,再次GetOrAdd时任务体不会被执行
TaskServicesManager.GetOrAdd("StorageRunOnce", token =>
{
return Task.CompletedTask;
});
// 2.利用发射获得 IStorage 实例
var factory = typeof(TaskServicesManager).GetProperty("Factory", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
var instance = factory.GetValue(null, null);
var storageInstance = instance.GetType().GetProperty("Storage").GetValue(instance);
var option = storageInstance.GetType().GetProperty("Options").GetValue(storageInstance) as FileStorageOptions;
option.DeleteFileByRemoveEvent = true;
TaskServicesManager.Clear();
option.DeleteFileByRemoveEvent = false;
相关文档
Wiki: 传送门
定时调度插件------Longbow.Tasks的更多相关文章
- .NET Core 实现后台任务(定时任务)Longbow.Tasks 组件(三)
原文链接:https://www.cnblogs.com/ysmc/p/16512309.html 在上两篇文章中,简单介绍了怎么使用 IHostedService 与 BackgroundServi ...
- Java学习笔记 -- Java定时调度工具Timer类
1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...
- SpringBoot系列九:SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 服务整合 2.背景 在进行项目开发的时候经常会遇见以下的几个问题:需要进行邮件发送.定时的任务调 ...
- java定时调度器解决方案分类及特性介绍
什么是定时调度器? 我们知道程序的运行要么是由事件触发的,而这种事件的触发源头往往是用户通过ui交互操作层层传递过来的:但是我们知道还有另外一种由机器系统时间触发的程序运行场景.大家想想是否遇到或者听 ...
- ASP.NET Core使用Quartz定时调度
在应用程序开发过程中,经常会需要定时任务调度功能,本篇博客介绍Asp.net Core如何使用Quartz完成定时调度 一.Quartz使用步骤 创建调度器scheduler,并开启 创建Job作业 ...
- Quartz定时调度框架
Quartz定时调度框架CronTrigger时间配置格式说明 CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年 ...
- Spring Quartz定时调度任务配置
applicationContext-quartz.xml定时调度任务启动代码: <?xml version="1.0" encoding="UTF-8" ...
- 定时调度框架Quartz随笔
最近项目中的定时批处理用到了quartz定时任务,在此记录下quartz的配置吧,一个小demo仅供参考,也方便自己今后复习! 下面直接来步骤吧! 一.首先,要搭起能让quartz正常运行的环境,至少 ...
- wordpress自动批量定时发布插件 DX-auto-publish
DX-auto-publish是一款wordpress自动发布插件,方便实用. 该wordpress插件的主要功能如下: 1.能够自动批量定时发布wordpress站点的草稿文章,无需每篇文章都手动设 ...
- crontab 定时调度
crontab -e */1 8-23 * * * /www/target/sh/myorder.sh & 0 1 * * * /www/target/php/sh/mymoney.sh &a ...
随机推荐
- JS 学习笔记(一)常用的字符串去重方法
要求:从输入框中输入一串字符,按回车后输出去重后的字符串 方法一: <body> <input type="text" id="input" ...
- 【深入浅出 Yarn 架构与实现】1-2 搭建 Hadoop 源码阅读环境
本文将介绍如何使用 idea 搭建 Hadoop 源码阅读环境.(默认已安装好 Java.Maven 环境) 一.搭建源码阅读环境 一)idea 导入 hadoop 工程 从 github 上拉取代码 ...
- zk系列一:zookeeper基础介绍
聊完kafka必不可少的需要再聊一聊zk了,下面开始 一.ZK是什么 ZooKeeper是分布式应用程序的高性能协调服务.它可以实现分布式的选主.统一配置管理,命名,分布式节点同步,分布式锁等分布式常 ...
- Windows骚操作
电脑常用的快捷键 键盘功能健:Tab.Shift.Ctrl.Alt.Windows.Enter.空格.上下左右健.CapsLock(大小写转换).NumLock(对小键盘控制开/关) 键盘快捷键:全选 ...
- 又拍云之 Keepalived 高可用部署
在聊 Keepalived 之前,我们需要先简单了解一下 VRRP.VRRP(Virtual Router Redundancy Protocol)即虚拟路由冗余协议,是专门为了解决静态路由的高可用而 ...
- 二叉树总结——BiTree
在C++编译器下可直接运行 #include <stdio.h> #include <malloc.h> //算法思想:先读入根结点数据,并且创建根结点,在读入左子树数据并创建 ...
- Centos 7.6 安装部署 openGauss 3.1.0 企业版一主两备集群
一.安装环境设置 1.1 硬件环境 名称 最低配置 建议配置 测试配置 服务器数量 3 略 略 硬盘 * 至少1GB用于安装openGauss的应用程序.* 每个主机需大约300MB用于元数据存储.* ...
- 单节点部署 gpmall 商城
个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying 1 修改主机名: [root@localhost ...
- Kubernetes_从零开始搭建k8s集群(亲测可用)
一.前言 本文讲述从零开始搭建k8s集群,均使用国内镜像,版本均统一,使用两个虚拟机,一个主节点,一个从节点,保证k8s一次搭建成功. 注意:Kubernetes,简称K8s,是用8代替名字中间的8个 ...
- EluxJS-让你像切蛋糕一样拆解前端巨石应用
大家好,EluxJS是一套基于"微模块"和"模型驱动"的跨平台.跨框架『同构方案』,欢迎了解... 可怕的巨石怪 工作中最可怕的是什么?是遇到业务复杂且乱作一团 ...