定时调度插件------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 ...
随机推荐
- C#使用不安全指针来操作bitmap
C#允许通过不安全指针实现像C++一样操作指针,这个速度是最快的.下面这个例子是修改一幅RGB图像的每个像素值,速度很快,测试一张2592*1944的彩色图像,只需要几ms就能够全部遍历. /// & ...
- Postman使用指导
1. 下载好Postman,不用注册账号,直接离线使用 2. 软件的配置修改: 2.1关闭SSL认证 2.2关闭系统代理 2.3上传证书填写hosthost为服务器地址和端口:crt和key可以通过国 ...
- i春秋Zone
打开网页是个简单的表单填写, 尝试注入....没用 查看源码,没找到什么有用的信息 只有抓包了 发现一个cookie的login值为0,改为1试试 没什么特别的回显,但这应该就是登录与否的判定了,所以 ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(35)-Fiddler如何抓取微信小程序的包-下篇
1.简介 通过前边和宏哥的学习,我们了解到Android 7.0 之后增加了对第三方证书的限制,抓包工具(charles.fiddler等)提供的证书都无法通过校验,也就无法抓取HTTPS请求了,对测 ...
- JUC源码学习笔记6——ReentrantReadWriteLock
系列文章目录和关于我 阅读此文需要有AQS独占和AQS共享的源码功底,推荐阅读: 1.JUC源码学习笔记1--AQS独占模式和ReentrantLock 2.JUC源码学习笔记2--AQS共享和Sem ...
- JavaEE Day03 MySQL约束
MySQL约束--今日内容 1. SQL-(DDL,DML,DQL),讲完DQL查询语句的使用 排序查询 聚合函数 分组查询 分页查询 2. 约束 3. 多表之间的关系 4. 范式(用于更好地设计表, ...
- python -m pip install --upgrade pip报No module named pip解决方法
解决方法: 1. python -m ensurepip 2. python -m pip install --upgrade pip 注意:添加pip环境变量 在python安装目录下搜索pip3或 ...
- JavaScript:是一种什么样的编程语言?
有关JavaScript的发展历程,百度百科上已经说得很清楚了,这里不赘述,只是想谈一下我刚刚接触JS的一些感触. 作为后端java开发者,初次学习JS的时候,真的觉得JS非常的不严谨,很混乱.由于它 ...
- 如何使用ChatGPT来自动化Python任务
1.概述 最近,比较火热的ChatGPT很受欢迎.今天,笔者为大家来介绍一下ChatGPT能做哪些事情. 2.内容 ChatGPT是一款由OpenAI开发的专门从事对话的AI聊天机器人.它的目标是让A ...
- Vulnhub之Credit_Card_Scammers靶场渗透
前言 一次"夺旗"练习,涵盖了许多不同的技巧. 背后的故事:骗子正在利用人们,各种假冒购物网站已经建立起来,但人们发现他们的订单从未到达.我们发现了一个诈骗网站,我们认为该网站正在 ...