欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Window服务基于Quartz.Net组件实现定时任务调度(二)

程序员文章站 2022-08-02 11:23:51
前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器)。其中job是需要在一个定时任务中具体执行的业务逻辑,trigger通过规定job何时并按照何种指定的 ......

前言

   在中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于quartz.net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器)。其中job是需要在一个定时任务中具体执行的业务逻辑,trigger通过规定job何时并按照何种指定的规则进行执行,最后job和trigger会被注册到scheduler中,利用scheduler(调度器)来负责协调job和trigger的搭配运行。

  你是否在工作中会遇到需要软件具有自动执行任务的功能,但是又不希望直接启动软件来手动执行任务? 

                         Window服务基于Quartz.Net组件实现定时任务调度(二)

  这个时候,我们可以考虑用到window服务,基于quartz.net组件定时轮询数据库同步,定时邮件通知,定时处理数据等功能。

开始

首先创建一个windows服务项目

Window服务基于Quartz.Net组件实现定时任务调度(二)

在创建好的项目中,service1.cs文件中点击“单击此处切换到代码视图”切换到代码

Window服务基于Quartz.Net组件实现定时任务调度(二)

这个时候我们可以注意到两个方法:onstart  (服务启动)和 onstop(服务停止)

        /// <summary>
        /// 服务启动
        /// </summary>
        /// <param name="args"></param>
        protected override void onstart(string[] args)
        {
        }
        /// <summary>
        /// 服务停止
        /// </summary>
        protected override void onstop()
        {
        }

一、创建一个scheduler的引用

            ischedulerfactory schedfact = new stdschedulerfactory();
            ischeduler sched = await schedfact.getscheduler();

二、启动 scheduler:

            await sched.start();

三、实现ijob:

syncjob.cs 实现ijob,在execute方法里编写要处理的业务逻辑,系统就会按照quartz的配置,定时处理

    [invoke(name = "syncjob", remark = "quartz服务", group = "quartz服务管理", begin = "2018-05-01 12:00:00", interval = 5)]
    public class syncjob : ijob
    {
        public task execute(ijobexecutioncontext context)
        {
            try
            {
                //每次执行 获取当前时间 输出当前时间
                //可以在这里编写每次定时执行需要的方法
                loghelper.savelog("输出日志", "在当前时间:" + datetime.now + "--上一次执行时间:" + datetime.now.addseconds(-5));
            }
            catch (exception ex)
            {
                loghelper.savelog(ex);
            }

            return null;
        }
    }

四、创建trigger:(建立一个某个时间点的触发器,并且每5秒执行一次)

            itrigger trigger = triggerbuilder.create()
                .withidentity("trigger1", "group1")  //触发器 组
                .withsimpleschedule(x => x.withintervalinseconds(5).repeatforever())
                .build();

五、触发器执行任务:

            await sched.schedulejob(job, trigger);

将几个步骤整合后代码如下:

        /// <summary>
        /// 服务启动
        /// </summary>
        /// <param name="args"></param>
        protected override void onstart(string[] args)
        {
            run().getawaiter().getresult();
            loghelper.savelog("服务", "开始");
        }
        /// <summary>
        /// 服务停止
        /// </summary>
        protected override void onstop()
        {
            try
            {
                if (scheduler != null)
                {
                    scheduler.shutdown();
                }
            }
            catch (exception ex)
            {
                loghelper.savelog(ex);
            }
            loghelper.savelog("服务", "结束");
        }

        ischeduler scheduler;
        private async task run()
        {
            try
            {
                namevaluecollection props = new namevaluecollection
                {
                    { "quartz.serializer.type", "binary" }
                };
                stdschedulerfactory factory = new stdschedulerfactory(props);
                scheduler = await factory.getscheduler();

                await scheduler.start();
                jobs.jobs.config(scheduler);
            }
            catch (schedulerexception ex)
            {
                loghelper.savelog(ex);
            }

        }

安装

以管理员的身份打开cmd

 Window服务基于Quartz.Net组件实现定时任务调度(二)

Window服务基于Quartz.Net组件实现定时任务调度(二)

运行

间隔5秒执行一次后的效果:

通过日志的方式输出数据,查看效果

Window服务基于Quartz.Net组件实现定时任务调度(二)

附加

 一、删除服务

以管理员的身份打开cmd

 Window服务基于Quartz.Net组件实现定时任务调度(二)

二、调试window服务

1)安装并运行服务

Window服务基于Quartz.Net组件实现定时任务调度(二)

 

2)附加进程

Window服务基于Quartz.Net组件实现定时任务调度(二)

Window服务基于Quartz.Net组件实现定时任务调度(二)

3)在代码中加入断点进行调试

Window服务基于Quartz.Net组件实现定时任务调度(二)

总结

1.当我们在需要用到定时执行任务的时候,可以考虑使用通过window服务加上quartz组件结合的方式,实现对任务的定时执行,这也是在很多场景中可以实现的方法,比如:定时轮询数据库同步,定时邮件通知,定时处理数据等

2.通过管理工具显示当前执行的任务和执行情况,也利用调试工具调试window服务中遇到的问题。

3.quartz还有更多的用法,可以参考资料:quartz.net官方文档   和  quartz.net开源地址

4.搜索关注公众号【杂学谷】--回复【定时服务】,可获取源码下载地址内容