windows服务

2021-02-19 08:19

阅读:661

前提背景:

  项目中需要定时去根据数据库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()
                                        .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 就可以看到我们刚刚安装的服务了 
技术分享图片
溜了溜了


评论


亲,登录后才可以留言!