紧接着上一篇。上一篇讲了表设计与ADO.Net基本操作。接下来,就来说说怎么动态来添加Job任务及清理过期任务吧。

首先,先理一下思路,做事情要先把思绪理清了,然后下手就快准狠了。下面是我的思路:做一个定时任务去检查任务表(job_info)中的所有Job,如果在Schedule中不存在的,则添加进来;

已存在的,则根据当时Job的状态来决定是否继续保留Job存活在Schedule中。

好了,有上面这样一个思路做出来就方便了,先了解一下操作Schedule中的Job几个方法:

  • 添加:scheduler.ScheduleJob(job, trigger);
  • 暂停:scheduler.PauseJob(jobKey);
  • 删除:scheduler.DeleteJob(jobKey);

现在,在JobManage.Job中添加一个LoopJob Job任务,定期检查Schedule中的Job,其核心代码如下:

List<Job_Info> jobList = new JobInfoBLL().GetJobList();
if (jobList != null && jobList.Count > )
{
JobKey jobKey = null;
foreach (var jobinfo in jobList)
{
jobKey = new JobKey(jobinfo.Job_name + JobConfig.JOBKEY_NAMEEND, "group1");
//只有正常执行状态的Job才添加到调度器中
if (!JobConfig.scheduler.CheckExists(jobKey) && jobinfo.Job_state == )
{
IJobDetail job = JobBuilder.Create<RunTaskDLLJob>().WithIdentity(jobKey).Build(); //创建触发器
TriggerBuilder tb = TriggerBuilder.Create()
.WithIdentity(jobinfo.Job_name + JobConfig.JOBTRIGGER_NAMEEND, "group1");
if (!string.IsNullOrEmpty(jobinfo.Job_corn))
tb.WithCronSchedule(jobinfo.Job_corn);//执行corn表达式
if (jobinfo.Job_execount > )//如果执行固定的次数
tb.WithSimpleSchedule(a => a.WithRepeatCount(jobinfo.Job_execount)); if (jobinfo.Job_starttime != null && jobinfo.Job_starttime > DateTime.Now)//设置Job启动时间
tb.StartAt(jobinfo.Job_starttime);
else
tb.StartNow(); ITrigger trigger = tb.Build();
//传递参数
job.JobDataMap.Add(jobKey.Name, jobinfo.Id); JobConfig.scheduler.ScheduleJob(job, trigger); Log4NetHelper.Info(string.Format("加入Job:{0}成功", jobKey.Name), logger: logger);
}
else if (JobConfig.scheduler.CheckExists(jobKey))
{
if (jobinfo.Job_state == || jobinfo.Job_state == )
{
JobConfig.scheduler.PauseJob(jobKey);
Log4NetHelper.Info(string.Format("暂停Job:{0}成功", jobKey.Name), logger: logger);
}
else if (jobinfo.Job_state == )
{
JobConfig.scheduler.DeleteJob(jobKey);
Log4NetHelper.Info(string.Format("删除Job:{0}成功", jobKey.Name), logger: logger);
}
}
}
}

到这里,可以理整个项目就完成的,差不多了。但是往往只在Job_Log是不足以记录运行日记及调试日志的。所以我就加了一个日志项,JobManage.Log,里面可提供Log4Net日志及单纯文本日志,具体的请查看项目源码。

其实这个LoopJob可以使用定时器来代替的,我个人觉得既然使用了Quartz那就一起用了,这个凭个人喜好而定。好了,检查Job的任务有了,那接下来,就要执行Job了。到这里,我们定义在JobManage.Lib中的接口就发

挥它的作用了。再来添加一个Job,在Execute中,反射出实现了Lib中的接口的类,并调用方法完成Job的执行。如下:

Assembly assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + job.Job_assembly);
object obj = assembly.CreateInstance(job.Job_class); Lib.IJob jobi = (Lib.IJob)obj; jobbll.UpdateJobState(new Job_Info() { Job_state = , Id = job.Id }); var r = jobi.Exceute();

好了,至此我们的服务端已经写完了。下面就开始管理端的事了。

源码github:https://github.com/zshankang/JobManage

如果有其他的问题,可以加QQ群:1600800 

基于Quartz.net的远程任务管理系统 二的更多相关文章

  1. 基于Quartz.net的远程任务管理系统-起绪

    Quartz.net这一个任务调度框架,相信大部分的开发者都非常的熟悉了. 往往在一个项目之中,我们会有很多的定时任务,加之多人参与编码,难免会有些难于管理等问题.为统一编写规范,以及对定时任务的管理 ...

  2. 基于Quartz.net的远程任务管理系统 一

    在上一篇绪中,已经介绍了整个项目的情况下了,接下来就是开始一步步做起来了. 首先:先整个我们的Job任务表,以及Job执行日志表.SQL如下: drop table if exists job_inf ...

  3. 基于Quartz.net的远程任务管理系统 三

    在上一篇中,已经把服务端都做好了.那接下来就是Web的管理端了,因为很多时候服务器是有专门的运维来管理的,我们没有权限去操作,所以有个可以管理Job的工具还是很有必要的. Web管理端,我选择现在很成 ...

  4. 基于VUE实现的新闻后台管理系统-二

    基础环境及最后的开发效果已完成说明,接下来就开始配置. ¶npm初始化 新建项目文件夹VueDemo,在其内执行如下脚本 npm init -y 安装vue-cli构建包 yarn add vue-c ...

  5. 文献综述二十:基于UML技术的客户关系管理系统实现

    一.基本信息 标题:基于UML技术的客户关系管理系统实现 时间:2015 出版源:电子设计工程 文件分类:uml技术的研究 二.研究背景 设计出可应用与银行和储户之间沟通的客户关系管理系统,从而实现对 ...

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

    前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ...

  7. Java 基于quartz实现定时 之二(XML方式配置)

    <!-- 在spring核心配置文件中进行如下配置 --> <!-- Spring基于quartz定时任务 --> <bean id="triggerByBea ...

  8. Quartz.NET总结(五)基于Quartz.net 的开源任务管理平台

    前面总结了很多,关于Quartz.net 的文章,介绍了如何使用Quartz.net.不清楚的朋友,可以看我之前的系列文章,http://www.cnblogs.com/zhangweizhong/c ...

  9. 烂泥:学习ubuntu远程桌面(二):远程桌面会话管理

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 在上一篇文章中,我们讲解了如何给ubuntu安装远程桌面及其配置,这篇文章我们再来讲解下有关ubuntu远程桌面会话的问题. 一.问题描述 在我们使用ub ...

随机推荐

  1. Sql Server-使用Sql Server自带的分词功能实现字段关键词提取(分词能力很低,慎用)

    “创建全文索引 启动服务 在SQL Server配置管理工具中,找到'SQL Full-text Filter Daemon Launcher'服务用本地用户启动. 创建全文目录 打开需要创建全文目录 ...

  2. Python之单元测试框架unittest

    创建class继承unittest,每一个测试用例是以test开头的函数,先执行setup,然后用例按照字母的顺序执行,然后执行teardown import unittest class demo( ...

  3. leetcode374

    // Forward declaration of guess API. // @param num, your guess // @return -1 if my number is lower, ...

  4. pthread_create用法(转)

    在转载别人文章之前,说一下 pthread_create(); 创建线程返回值. 正常情况下,创建成功则返回 0 : 如果创建失败 通常返回常见的 错误返回代码为: EAGAIN #define   ...

  5. GBDT,Adaboosting概念区分 GBDT与xgboost区别

    http://blog.csdn.net/w28971023/article/details/8240756 ============================================= ...

  6. centos 安装hue 4.0

    Hue是Cloudera开源的一个Hadoop UI,由Cloudera Desktop演化而来.面向用户提供方便的UI用于平时的Hadoop操作中.Apache Ambari面向的是管理员,用于安装 ...

  7. 配置ssh免密登录后,仍需要密码才能登陆其中某台机器

    提示:如果是三台机器A.B.C配置了ssh免密登录,从A和B上登录C需要密码,则需要修改C的配置 修改配置文件如下: sudo vi /etc/ssh/sshd_config #禁用root账户登录, ...

  8. 【bzoj1597】[Usaco2008 Mar]土地购买

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3739  Solved: 1376[Submit] ...

  9. MongoDB中使用的SCRAM-SHA1认证机制

    摘要: 介绍 SCRAM是密码学中的一种认证机制,全称Salted Challenge Response Authentication Mechanism. SCRAM适用于使用基于『用户名:密码』这 ...

  10. Golang之方法(自定义类型,struct)

    方法的使用,请看本天师的代码 //Golang的方法定义 //Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以有方法,不仅仅是struct //定义:func (recevier ...