基于Quartz.net的远程任务管理系统 二
紧接着上一篇。上一篇讲了表设计与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的远程任务管理系统 二的更多相关文章
- 基于Quartz.net的远程任务管理系统-起绪
Quartz.net这一个任务调度框架,相信大部分的开发者都非常的熟悉了. 往往在一个项目之中,我们会有很多的定时任务,加之多人参与编码,难免会有些难于管理等问题.为统一编写规范,以及对定时任务的管理 ...
- 基于Quartz.net的远程任务管理系统 一
在上一篇绪中,已经介绍了整个项目的情况下了,接下来就是开始一步步做起来了. 首先:先整个我们的Job任务表,以及Job执行日志表.SQL如下: drop table if exists job_inf ...
- 基于Quartz.net的远程任务管理系统 三
在上一篇中,已经把服务端都做好了.那接下来就是Web的管理端了,因为很多时候服务器是有专门的运维来管理的,我们没有权限去操作,所以有个可以管理Job的工具还是很有必要的. Web管理端,我选择现在很成 ...
- 基于VUE实现的新闻后台管理系统-二
基础环境及最后的开发效果已完成说明,接下来就开始配置. ¶npm初始化 新建项目文件夹VueDemo,在其内执行如下脚本 npm init -y 安装vue-cli构建包 yarn add vue-c ...
- 文献综述二十:基于UML技术的客户关系管理系统实现
一.基本信息 标题:基于UML技术的客户关系管理系统实现 时间:2015 出版源:电子设计工程 文件分类:uml技术的研究 二.研究背景 设计出可应用与银行和储户之间沟通的客户关系管理系统,从而实现对 ...
- Window服务基于Quartz.Net组件实现定时任务调度(二)
前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ...
- Java 基于quartz实现定时 之二(XML方式配置)
<!-- 在spring核心配置文件中进行如下配置 --> <!-- Spring基于quartz定时任务 --> <bean id="triggerByBea ...
- Quartz.NET总结(五)基于Quartz.net 的开源任务管理平台
前面总结了很多,关于Quartz.net 的文章,介绍了如何使用Quartz.net.不清楚的朋友,可以看我之前的系列文章,http://www.cnblogs.com/zhangweizhong/c ...
- 烂泥:学习ubuntu远程桌面(二):远程桌面会话管理
本文由秀依林枫提供友情赞助,首发于烂泥行天下 在上一篇文章中,我们讲解了如何给ubuntu安装远程桌面及其配置,这篇文章我们再来讲解下有关ubuntu远程桌面会话的问题. 一.问题描述 在我们使用ub ...
随机推荐
- win10 svn commit无响应
只是发现其中的一个原因,发现.cs代码文件图标变红了,默认是用Code Writer打开,和SVN可能是冲突了,解决方式是用Code Writer打开一下.cs文件就可以了,原因可能是不打开一次Cod ...
- PDF预览之PDFObject.js总结
get from:PDF预览之PDFObject.js总结 PDFObject.js - 将PDF嵌入到一个div内,而不是占据整个页面(要求浏览器支持显示PDF,不支持,可配置PDF.js来实现 ...
- 535. Encode and Decode TinyURL
▶ 要求给出一种对 URL 网址进行压缩和解压的算法,例如 https://leetcode.com/problems/design-tinyurl ←→ http://tinyurl.com/4e9 ...
- jQuery常用属性方法大全 attr(),val()
@@@@属性篇: 写作本篇文章的意义:jQuery的教程千千万,却没有英文版的API讲的系统.到位,一些话用中文翻译过来味道就变了,所以我将英文版的API的一些常用的方法单独提出来放在这里,并用自己的 ...
- windows 关机 重启 命令
关机 shutdown -s -t 0 重启 shutdown -r -t 0 重启电脑windows 立即关机 shutdown -s 三十分钟后关机 shutdown -s -t 30 举例说明一 ...
- Spring Boot日志集成
Spring Boot日志框架 Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用 ...
- 9 MySQL--多表查询
多表查询: http://www.cnblogs.com/linhaifeng/articles/7267596.html 1.多表连接查询 2.符合条件连接查询 3.子查询 一.准备表 #建表 cr ...
- Source命令及脚本的执行方式
[Source命令及脚本的执行方式] source filename 与 sh filename 及./filename执行脚本的区别在那里呢? 1.当shell脚本具有可执行权限时,用sh file ...
- Mysql,重复字段只取其中一行
Mysql,重复字段只取其中一行 格式 : select 字段 from [表] where 其他字段 in (select 函数(其他字段) from [表] group by 相同字段) 示例如下 ...
- Python any() 函数
Python any() 函数 Python 内置函数 描述 any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 ...