.NET使用Quartz Topshelf实现定时执行任务调度服务

文旅笔记家 2021-01-22 ⋅ 29 阅读

引言

在软件开发过程中,经常需要执行一些定时任务,例如定时发送邮件、定时备份数据库等。为了方便管理和调度这些任务,我们可以使用Quartz.Net作为任务调度框架。同时,我们可以使用Topshelf作为.NET应用程序的服务框架,将任务调度服务作为一个后台服务运行。

本文将介绍如何使用Quartz.Net和Topshelf来实现一个定时执行任务调度服务。

1. Quartz.Net简介

Quartz.Net是一个完全开源的作业调度框架,可以实现在特定时间或间隔触发任务执行的功能。它提供了灵活的配置和管理任务,支持任务并发执行,同时还提供了丰富的API,方便我们对任务进行管理和监控。

2. Topshelf简介

Topshelf是一个能够简化.NET应用程序的服务化操作的开源框架。通过Topshelf,我们可以轻松地将.NET应用程序转化为一个可以作为Windows服务运行的后台服务。

3. 实现步骤

3.1 创建一个空的.NET控制台应用程序

在Visual Studio中,创建一个空的.NET控制台应用程序。

3.2 添加Quartz.Net和Topshelf的引用

使用NuGet包管理器,为项目添加QuartzTopshelf的引用。

3.3 创建任务类

创建一个继承自IJob接口的任务类,用于定义要执行的具体任务逻辑。例如,我们可以创建一个MyTask类,其中包含Execute方法来实现具体的任务逻辑。

public class MyTask : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Console.WriteLine("执行任务逻辑...");
    }
}

3.4 配置任务调度

Program.cs文件中,配置任务调度。首先,创建一个IScheduler对象。

var scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;

然后,使用JobBuilder创建一个任务,并将任务绑定到任务类。

var jobDetail = JobBuilder.Create<MyTask>()
    .WithIdentity("myJob", "group")
    .Build();

接下来,创建一个触发器,并配置触发器的执行规则。

var trigger = TriggerBuilder.Create()
    .WithIdentity("myTrigger", "group")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(10)
        .RepeatForever())
    .Build();

最后,将任务和触发器添加到任务调度器中,并启动任务调度器。

scheduler.ScheduleJob(jobDetail, trigger).Wait();
scheduler.Start().Wait();

3.5 使用Topshelf将任务调度服务作为Windows服务运行

Program.cs文件中,使用Topshelf将任务调度服务作为Windows服务运行。首先,使用HostFactory来创建一个服务主机。

HostFactory.Run(x =>
{
    x.Service<TaskSchedulerService>(s =>
    {
        s.ConstructUsing(name => new TaskSchedulerService());
        s.WhenStarted(tc => tc.Start());
        s.WhenStopped(tc => tc.Stop());
    });
    x.RunAsLocalSystem();

    x.SetDescription("任务调度服务");
    x.SetDisplayName("TaskSchedulerService");
    x.SetServiceName("TaskSchedulerService");
});

然后,创建一个TaskSchedulerService类,并在该类的Start方法中启动任务调度器。

public class TaskSchedulerService
{
    private IScheduler _scheduler;

    public void Start()
    {
        _scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
        _scheduler.Start().Wait();
    }

    public void Stop()
    {
        _scheduler.Shutdown(true).Wait();
    }
}

最后,运行该控制台应用程序,并在控制台查看任务执行的日志。

结论

使用Quartz.Net和Topshelf,我们可以简化定时执行任务调度服务的开发和管理。Quartz.Net提供了强大的任务调度功能,而Topshelf提供了方便的服务化操作。通过将任务调度服务作为Windows服务运行,我们可以确保任务的稳定执行,并方便地进行管理和监控。

参考资料


全部评论: 0

    我有话说: