WorkerService+Quartz
WorkerService真的太好用了,比WindowsService好用太多!爱了-3-
下面来记录一下步骤
1.创建WorkerService
创建好之后,结构如下
Program:项目入口
Worker:自带例子
2.在NuGet下载Quartz包(Quartz.Extensions.Hosting)
3.创建一个任务类( 继承Quartz中的IJob)
4.配置执行任务的时间表达式
每天早上11点31分执行任务
5.关联任务
services.AddQuartz(q => { q.UseMicrosoftDependencyInjectionScopedJobFactory(); //获取任务调度时间表达式 var jobKey = new JobKey("TestWorker"); var jobCronSchedule = hostContext.Configuration["Quartz:TestWorkerCron"]; //判断时间表达式是否存在 if (string.IsNullOrEmpty(jobCronSchedule)) { throw new Exception($"No Quartz.NET Cron schedule found for job in configuration at configKey"); } //在DI容器中注册任务 q.AddJob<TestWorker>(opts => opts.WithIdentity(jobKey)); //为任务添加触发器 q.AddTrigger(opts => opts .ForJob(jobKey) //触发器链接到TestWorker .WithIdentity("TestWorker-trigger") //为触发器命名 .WithCronSchedule(jobCronSchedule)); //使用配置中的时间表达式 }); services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
到这一步已经完成了,直接跑起来就可以了。 它是一个控制台程序。
如果不想要控制台程序,那么接着看,设为Windows服务。
6.在NuGet下载包(Microsoft.Extensions.Hosting.WindowsServices)
7.设置Windows服务
.UseWindowsService()
tip:如果使用服务,不要用logger!!!logger仅是控制台程序时使用的!!!
8.发布Windows服务
首先,以管理员身份运行cmd
-----------------------------------------cmd命令--------------------------------------------
创建服务
sc.exe create 服务名称 binPath=Windows服务所在的全路径(例如:D:\其它\TestWorkerService\TestWorkerService\bin\Debug\net5.0\TestWorkerService.exe)
启动服务
sc.exe start 服务名称
停用服务
sc.exe stop 服务名称
删除服务
sc.exe delete 服务名称
9.小细节
上面创建服务的那句话哦,乍一看好像没有什么毛病,我这边正式环境可以运行,可是测试环境会报错
选项名称包括等号。等号和值之间需要一个空格。
顾名思义就是在binPath等号后面加一个空格
Demo下载地址:https://files.cnblogs.com/files/MuZiLily/TestWorkerService.zip?t=1667294208