Quartz.net基于数据库的任务调度管理(Only.Jobs)

一 前言:

各大调度组件优缺点在这就不讨论了,使用Quartz.net是因为它可以执行秒级任务。

Only.Jobs 项目通过将各Job存储在数据库中,启动一个专门的Job管理任务来循环调度各Job的的调度情况。

 

项目分为 Web管理系统  、服务运行端   、数据提供逻辑处理层 

数据访问使用了 SqlSugar 4.1.1.5版本,目前支持MySql、SqlServer

采用Quartz.net+Topshelf  可安装为windows服务。 

二 项目结构:

一一介绍下:

Only.Jobs.Items 下是创建的测试Job项目。

Only.Jobs  是一个调度服务项目,集成了Topshelf,可安装成windows服务。

Only.Jobs.Core  是项目的核心层,对外提供数据操作。

Only.Jobs.Web 为调度任务的管理和状态监控管理系统。

先来看下总体效果吧

运行Only.Jobs.Web项目:

 

 

在任务管理模块可停止、启用各Job.

 

三 表结构介绍

BackgroundJob  为任务信息存储表

BackgroundJobLog 为任务执行跟踪日志表 

四 实现介绍

通过任务管理模块将开发好的Job所在的项目配置起来,存储到BackgroundJob表中。

在Only.Jobs项目中创建ManagerJob 类,Job调度任务管理。

[DisallowConcurrentExecution]

    public class ManagerJob : IJob

    {

        private readonly ILog _logger = LogManager.GetLogger(typeof(ManagerJob));


        public void Execute(IJobExecutionContext context)

        {

            Version Ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;

            _logger.InfoFormat("ManagerJob Execute begin Ver." + Ver.ToString());

            try

            {

                new QuartzManager().JobScheduler(context.Scheduler);

                _logger.InfoFormat("ManagerJob Executing ...");

            }

            catch (Exception ex)

            {

                JobExecutionException e2 = new JobExecutionException(ex);

                e2.RefireImmediately = true;

            }

            finally

            {

                _logger.InfoFormat("ManagerJob Execute end ");

            }

        }

    }

JobScheduler 方法:


/// <summary>

        /// Job状态管控

        /// </summary>

        /// <param name="Scheduler"></param>

        public void JobScheduler(IScheduler Scheduler)

        {

            List<BackgroundJobInfo> list = new BackgroundJobService().GeAllowScheduleJobInfoList();

            if (list != null && list.Count > 0)

            {

                foreach (BackgroundJobInfo jobInfo in list)

                {

                    JobKey jobKey = new JobKey(jobInfo.BackgroundJobId.ToString(), jobInfo.BackgroundJobId.ToString() + "Group");

                    if (Scheduler.CheckExists(jobKey) == false)

                    {

                        if (jobInfo.State == 1 || jobInfo.State == 3)

                        {

                            ScheduleJob(Scheduler, jobInfo);

                            if (Scheduler.CheckExists(jobKey) == false)

                            {

                                new BackgroundJobService().UpdateBackgroundJobState(jobInfo.BackgroundJobId, 0);

                            }

                            else

                            {

                                new BackgroundJobService().UpdateBackgroundJobState(jobInfo.BackgroundJobId, 1);

                            }

                        }

                        else if (jobInfo.State == 5)

                        {

                            new BackgroundJobService().UpdateBackgroundJobState(jobInfo.BackgroundJobId, 0);

                        }

                    }

                    else

                    {

                        if (jobInfo.State == 5)

                        {

                            Scheduler.DeleteJob(jobKey);

                            new BackgroundJobService().UpdateBackgroundJobState(jobInfo.BackgroundJobId, 0);

                        }

                        else if (jobInfo.State == 3)

                        {

                            new BackgroundJobService().UpdateBackgroundJobState(jobInfo.BackgroundJobId, 1);

                        }

                    }

                }

            }

        }

其他的简单的就不在这描述了。

接下来看下运行效果:

启动Only.Jobs项目

  

仅仅是一个工具项目而已,大家可尽管仍砖头过来。代码已上传github https://github.com/mamingbo/Only.Jobs  欢迎下载使用。

相关文章:

原文地址:http://www.cnblogs.com/mamingbo/p/7142057.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值