前提背景:
项目中需要定时去根据数据库A 的数据来同步数据库B 。一开始在global全局文件中写定时任务,发现存在进程池被回收,以及IIS 重启等一系列问题 导致定时任务执行个一两天就中断的情况(代码是从网上copy的发现注释有很大的问题,另外还需要更改iis的回收机制来配合代码,否则不会成功)
解决方案:
放弃使用global文件,使用windows服务+Quartz.NET
了解工具:
Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。 Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。
Quartz框架的一些基础概念解释:
Scheduler 作业调度器。
IJob 作业接口,继承并实现Execute, 编写执行的具体作业逻辑。
JobBuilder 根据设置,生成一个详细作业信息(JobDetail)。
TriggerBuilder 根据规则,生产对应的Trigger
好了接下来打开vs新建widows service程序 打开service1文件 点击图中文字
using Quartz; using Quartz.Impl; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; namespace WindowsService1 { public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { StartService();//启动服务执行代码 } private void StartService() { //to do something } protected override void OnStop() { //关闭服务执行代码 } } }
private void StartService() { //从工厂中获取一个调度器实例化 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler.Start(); //开启调度器 IJobDetail job = JobBuilder.Create<Class1>() .WithIdentity("myJob", "group1") .Build(); ITrigger trigger = TriggerBuilder.Create() .WithIdentity("mytrigger", "group1") .StartNow() .WithCronSchedule("0 0 0,6,12,18 * * ?") //时间表达式,每天的0点、6点、12点、18点都执行一次 .Build(); scheduler.ScheduleJob(job, trigger); }
using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using DTcms.Common; namespace WindowsService1 { public class Class1: IJob { public void Execute(IJobExecutionContext context) {
//这里放你的业务代码 DTcms.Model.cndingentity.interface_record_model model = new DTcms.Model.cndingentity.interface_record_model(); DTcms.BLL.interface_record ir_bll = new DTcms.BLL.interface_record(); model.action = "quartz.net"; model.is_success = 0; // model.description = "quartz.net开始跑了"; model.create_time = DateTime.Now; ir_bll.Add(model); } } }
好吧我被这个插入代码坑了 接下来的内容都只能在这里面写了
开始安装windows服务
管理员身份打开cmd,进入.net 4.0目录,一般都是C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319
运行命令 InstallUtil.exe 项目目录
cmd 输入services.msc 就可以看到我们刚刚安装的服务了
溜了溜了