详解.NET Core使用Quartz执行调度任务进阶
更新时间:2019年04月19日 09:42:28 作者:小世界的野孩子
这篇文章主要介绍了.NET Core使用Quartz执行调度任务进阶,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一、前言运用场景
Quartz.Net是一个强大、开源、轻量的作业调度框架,在平时的项目开发当中也会时不时的需要运用到定时调度方面的功能,例如每日凌晨需要统计前一天的数据,又或者每月初需要统计上月的数据。当然也会出现既要统计日的也统计月的还需要进行其他的操作。那我们改如何来写这样的调度任务呢?
二、实际运用(.Net Core 2.2)
在一个解决方案中创建一个.Net控制台应用程序及一个类库,控制台应用程序用来作为程序的启动点。类库用来作为调度任务的执行程序。
然后我们需要完善一下项目的结构,首先我们得在控制台应用程序中创建一个Startup类,这个类也是任务启动的一个重要条件。
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler(“/Error”);
}
app.UseMvc();
}
}
然后项目会报一定的错误,根据错误信息一步一步解决,解决方案:添加NuGet包 Microsoft.AspNetCore
解决错误信息之后意味着目前启动程序还算ok了,接下来我们可以详细讲下Quartz调度任务执行。
因为我们肯定不仅仅执行一个调度任务,实际项目运行中肯定是多个调度任务一起执行的,所以我们思路可以转变一下。在类库创建一个公共启动中心,同时引用NuGet包:Quartz。然后开始创建调度任务的公共核心
private IScheduler scheduler;
/// <summary>
/// 创建调度任务的入口
/// </summary>
/// <returns></returns>
public async Task Start()
{
await StartJob();
}
/// <summary>
/// 创建调度任务的公共调用中心
/// </summary>
/// <returns></returns>
public async Task StartJob()
{
//创建一个工厂
NameValueCollection param = new NameValueCollection()
{
{ “testJob”,”test”}
};
StdSchedulerFactory factory = new StdSchedulerFactory(param);
//创建一个调度器
scheduler = await factory.GetScheduler();
//开始调度器
await scheduler.Start();
//每三秒打印一个info日志
await CreateJob<StartLogInfoJob>(“_StartLogInfoJob”, “_StartLogInfoJob”, ” 0/3 * * * * ? “);
//每五秒打印一个debug日志
await CreateJob<StartLogDebugJob>(“_StartLogDebugJob”, “_StartLogDebugJob”, ” 0/5 * * * * ? “);
//调度器时间生成地址– cron.qqe2.com
}
/// <summary>
/// 停止调度器
/// </summary>
public void Stop()
{
scheduler.Shutdown();
scheduler=null;
}
/// <summary>
/// 创建运行的调度器
/// </summary>
/// <typeparam name=”T”></typeparam>
/// <param name=”name”></param>
/// <param name=”group”></param>
/// <param name=”cronTime”></param>
/// <returns></returns>
public async Task CreateJob<T>(string name,string group, string cronTime) where T: IJob
{
//创建一个作业
var job = JobBuilder.Create<T>()
.WithIdentity(“name” + name, “gtoup” + group)
.Build();
//创建一个触发器
var tigger = (ICronTrigger)TriggerBuilder.Create()
.WithIdentity(“name” + name, “group” + group)
.StartNow()
.WithCronSchedule(cronTime)
.Build();
//把作业和触发器放入调度器中
await scheduler.ScheduleJob(job, tigger);
}
然后再去创建两个执行业务逻辑的类,分别是StartLogInfoJob和StartLogDebugJob
public class StartLogInfoJob:IJob
{
public async Task Execute(IJobExecutionContext context)
{
await Start();
}
public async Task Start()
{
LogHelp.Debug(“调度打印Debug”);
}
}
public class StartLogDebugJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
await Start();
}
public async Task Start()
{
LogHelp.Info(“调度打印Info”);
}
}
到这里就顺利的完成了一个定时调度器来执行任务了,最后我们得把这个Program文件重新写一下,控制台应用程序生成的Program文件不太符合我们需要要求,同时把调度器在这里面启动。
class Program
{
static void Main(string[] args)
{
HandleStart();
var webHostArgs = args.Where(arg => arg != “–console”).ToArray();
var host = WebHost.CreateDefaultBuilder(webHostArgs)
.UseStartup<Startup>()
.UseKestrel(options => {
options.Limits.MinRequestBodyDataRate = null;
})
.Build();
host.Run();
}
static void HandleStart()
{
try
{
new Scheduler().Start().GetAwaiter().GetResult();
}
catch (Exception ex)
{
LogHelp.Error(ex);
}
}
}
我们去看文件夹下面Log文件会发现有一个Debug和一个Info
到这里我们的调度就完成了,我们需要使用的时候将打印日志更换成我们日常想要处理的业务逻辑就可以了。刚刚提到打印日志就顺便提一下在.Net Core中如何打印日志吧。
三、.Net Cor打印日志文件
打印日志文件主要是用到了NuGet包:NLog,然后再加上一个NLog.config,首先在项目中安装NLog的包,然后创建一个LogHelper的公共类。
public class LogHelp
{
static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public static void Debug(string info)
{
logger.Debug(info);
}
public static void Info(string info)
{
logger.Info(info);
}
public static void Error(Exception ex, string info = “”)
{
logger.Error(ex);
}
}
然后再添加一个NLog.config文件
<?xml version=”1.0″ encoding=”utf-8″ ?>
<nlog xmlns=”www.nlog-project.org/schemas/NLog.xsd”
xmlns:xsi=”www.w3.org/2001/XMLSchema-instance” autoReload=”true”>
<targets>
<target name=”defaultlog” xsi:type=”File” keepFileOpen=”false” encoding=”utf-8″
fileName=”${basedir}/logs/${level}/${shortdate}.log”
layout=”${longdate}|${level:uppercase=true}|${logger}|${message}” />
</targets>
<rules>
<logger name=”*” minlevel=”trace” writeTo=”defaultlog” />
</rules>
</nlog>
完成这两个就可以实现日志的打印了。。
以上所述是小编给大家介绍的.NET Core使用Quartz执行调度任务进阶详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对华域联盟网站的支持!
您可能感兴趣的文章:springboot+quartz以持久化的方式实现定时任务的代码Springboot整合quartz产生错误及解决方案SpringBoot集成Quartz实现定时任务的方法浅谈SpringBoot集成Quartz动态定时任务SpringBoot与Quartz集成实现分布式定时任务集群的代码实例.net core中Quartz的使用方法springboot Quartz动态修改cron表达式的方法Springboot整个Quartz实现动态定时任务的示例代码Quartz.Net实现原理及使用方法详解
.NET
Core
Quartz
任务进阶
相关文章
微信小程序 (十七)input 组件详细介绍这篇文章主要介绍了微信小程序 input 组件详细介绍的相关资料,需要的朋友可以参考下 2016-09-09
ASP.NET使用gridview获取当前行的索引值这篇文章主要介绍了ASP.NET使用gridview获取当前行的索引值的方法汇总,有需要的小伙伴可以参考下。 2015-06-06
.net采用ajax实现邮箱注册和地区选择实例这篇文章主要介绍了.net采用ajax实现邮箱注册和地区选择的方法,以实例形式详细讲述了.net采用ajax的技巧,非常实用,需要的朋友可以参考下 2014-10-10
ASP.NET MVC3 SEO优化:利用Routing特性提高站点权重这篇文章主要介绍了ASP.NET MVC3 SEO优化:利用Routing特性消除多个路径指向同一个Action,从而提高站点权重,需要的朋友可以参考下。 2016-06-06
VC用Ado接口连接和使用数据库及注意事项进行方法调用时,所传递的参数的类型的转换(可能存在比本文更简便的处理方法但我未发现) ,需要了解的朋友可以参考下 2012-12-12
ASP.NET封装的SQL数据库访问类ASP.NET SQL数据库封装访问类代码 2009-02-02
asp.net中绑定TextBox回车事件的解决方法asp.net中绑定TextBox回车事件的解决方法,需要的朋友可以参考下。 2011-07-07
.NetCore之接口缓存的实现示例这篇文章主要介绍了.NetCore之接口缓存的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2020-09-09
asp.net使用AJAX实现无刷新分页AJAX(Asynchronous JavaScript and XML)是一种进行页面局部异步刷新的技术。用AJAX向服务器发送请求和获得服务器返回的数据并且更新到界面中,不是整个页面刷新,而是在页面中使用Js创建XMLHTTPRequest对象来向服务器发出请求以及获得返回的数据。 2014-11-11
asp.net上传文件到数据库的解决方案这篇文章主要介绍了ASP.NET上传文件到数据库,先从文字上了解一下上传文件到数据库的具体步骤,再从代码上来实现,需要的朋友可以参考下 2015-09-09
最新评论

评论(0)