Quartz.Net分布式任务管理平台(续)
感谢@Taking园友得建议,我这边确实多做了一步上传,导致后面还需处理同步上传到其他服务器来支持分布式得操作。所有才有了上篇文章得完善。
首先看一下新的项目结构图:
这个图和上篇文章中的图大家可以看到有不一样的地方,那就是我们取消了任务子类。
首先我们添加任务子类的目的是想别人开发任务的时候程序集尽量的干净,而对于我们Quartz来说真正运行的还是我们基类中的Excute方法,我们Web中需要通过反射子任务类来添加到Quartz中而现在我们通过直接反射任务基类添加到Quartz当中,这样我们依然保持了干净的程序集,同时我们也回归了本质,子任务类在Quartz中并没有起作用这一点要弄明白。
其次按原来的模式我们添加一个任务我们需要添加一个类库然后去继承基类然后设置url编译,添加任务的时候上传这将导致两个问题,
一:当任务过多时我们项目会变的类库特别大,每次建类库也很麻烦
二:我们为了做分布式意味着 我们要将上传的dll同时保存到三台服务器中的Web,和Quartz的服务节点,这个我们将需要额外的逻辑去处理麻烦。
那么现在这样的结构无论是对编写任务的人,还是做分布式就相对于说变得简单的多了。
现在看一下项目得改变:首先子任务的类库取消,任务基类改变如下:
public class JobBase : IJob
{
public void Execute(IJobExecutionContext context)
{
try
{
HttpClient hc = new HttpClient();
hc.GetAsync(context.JobDetail.JobDataMap["requestUrl"].ToString());
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
} }
这边取得任务被添加到Quartz时附带得信息也就是requestUrl,这一步我们在下面任务运行得时候会看到;同时我们得添加任务得界面输入得信息会变少:
这边添加任务的时候跟上一篇中对比我们不需要上传程序集,不需要程序集的名字和任务的类名,因为这些东西我们都已经知道就是我们现在的JobBase,而我们现在需要的是上篇文章中的子类设置请求地址现在放到添加任务得时候,保存到数据库中,添加任务得代码也会变得更简单:
[HttpPost]
/// <summary>
/// 添加任务
/// </summary>
/// <param name="jobName">任务名称</param>
/// <param name="jobGroupName">任务所在组名称</param>
/// <param name="triggerName">触发器名称</param>
/// <param name="triggerGroupName">触发器所在的组名称</param>
/// <param name="cron">执行周期表达式</param>
/// <param name="jobDescription">任务描述</param>
/// <param name="requestUrl">请求地址</param> /// <returns></returns> public JsonResult AddJob(string jobName, string jobGroupName, string triggerName, string triggerGroupName, string cron, string jobDescription,string requestUrl)
{
var jobId = _customerJobInfoRepository.AddCustomerJobInfo(jobName, jobGroupName, triggerName, triggerGroupName, cron, jobDescription, requestUrl);
return Json(ResponseDataFactory.CreateAjaxResponseData("", "添加成功", jobId)); }
当任务运行得时候去除设置到Quartz中,现在运行任务得方法更改如下:
/// <summary>
/// 运行任务
/// </summary>
/// <param name="jobInfo">任务信息</param>
/// <returns></returns>
public bool RunJob(Customer_JobInfo jobInfo)
{
Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + $"bin/{jobInfo.DLLName}");
var type = assembly.GetType(jobInfo.FullJobName);
JobKey jobKey = _createJobKey(jobInfo.JobName, jobInfo.JobGroupName);
if (!_scheduler.CheckExists(jobKey))
{
IJobDetail job = JobBuilder.Create(type)
.WithIdentity(jobKey)
.UsingJobData(_createJobDataMap("jobId", jobInfo.Id))
.UsingJobData(_createJobDataMap("requestUrl",jobInfo.RequestUrl))//添加此任务请求地址附带到Context上下文中
.Build(); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.CronSchedule(jobInfo.Cron);
ITrigger trigger = TriggerBuilder.Create().StartNow()//StartAt(DateTime.SpecifyKind(jobInfo.JobStartTime, DateTimeKind.Local))
.WithIdentity(jobInfo.TriggerName, jobInfo.TriggerGroupName)
.ForJob(jobKey)
.WithSchedule(scheduleBuilder.WithMisfireHandlingInstructionDoNothing())
.Build();
#region Quartz 任务miss之后三种操作
/*
withMisfireHandlingInstructionDoNothing
——不触发立即执行
——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行 withMisfireHandlingInstructionIgnoreMisfires
——以错过的第一个频率时间立刻开始执行
——重做错过的所有频率周期后
——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行 withMisfireHandlingInstructionFireAndProceed
——以当前时间为触发频率立刻触发一次执行
——然后按照Cron频率依次执行*/
#endregion _scheduler.ScheduleJob(job, trigger); }
return true;
}
其实上篇我们添加监听器时往这个里面增加的jobId,当时没有想到把requestUrl运用上,再次感谢园友提醒。那么现在我们这次发现得问题得已解决:
一:现在对于编写任务得人就只需要在界面操作添加requestUrl了,不需要编写任务代码
二:不会见到一大推子任务程序集在项目中,
三:使得分布式更加简单只要我们的Web负载就可以了
Quartz.Net分布式任务管理平台(续)的更多相关文章
- Quartz.Net分布式任务管理平台
无关主题:一段时间没有更新文章了,与自己心里的坚持还是背驰,虽然这期间在公司做了统计分析,由于资源分配问题,自己或多或少的原因,确实拖得有点久了,自己这段时间也有点松懈,借口就不说那么多 ...
- Quartz.Net分布式任务管理平台(第二版)
前言:在Quartz.Net项目发布第一版后,有挺多园友去下载使用,我们通过QQ去探讨,其中项目中还是存在一定的不完善.所以有了现在这个版本.这个版本的编写完成其实有段时间了一直没有放上去.现在已经同 ...
- Quart.Net分布式任务管理平台
无关主题:一段时间没有更新文章了,与自己心里的坚持还是背驰,虽然这期间在公司做了统计分析,由于资源分配问题,自己或多或少的原因,确实拖得有点久了,自己这段时间也有点松懈,借口就不说那么多 ...
- Quart.Net分布式任务管理平台(续)
感谢@Taking园友得建议,我这边确实多做了一步上传,导致后面还需处理同步上传到其他服务器来支持分布式得操作.所有才有了上篇文章得完善. 首先看一下新的项目结构图: 这个图和上篇文章中 ...
- Quartz.NET总结(五)基于Quartz.net 的开源任务管理平台
前面总结了很多,关于Quartz.net 的文章,介绍了如何使用Quartz.net.不清楚的朋友,可以看我之前的系列文章,http://www.cnblogs.com/zhangweizhong/c ...
- Quartz.net 的开源任务管理平台
Quartz.net 的开源任务管理平台 前面总结了很多,关于Quartz.net 的文章,介绍了如何使用Quartz.net.不清楚的朋友,可以看我之前的系列文章,http://www.cnblog ...
- 转载《分布式任务调度平台XXL-JOB》
<分布式任务调度平台XXL-JOB> 博文转自 https://www.cnblogs.com/xuxueli/p/5021979.html 一.简介 1.1 概述 XXL-J ...
- 分布式任务调度平台XXL-JOB
<分布式任务调度平台XXL-JOB> 一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并 ...
- 《分布式任务调度平台XXL-JOB》
一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 1.2 特性 1.简单:支 ...
随机推荐
- Backbone.js学习之旅(一)
前言 刚到粑粑公司,就学习各种框架,进行各种开发,为了纪念挥泪的青春,只好写下…… 希望能合您胃口^_^!!! The First(文件准备) backobone 强制依赖于 underscore.j ...
- JS列表
promise 引用类型/值类型 ----- 对比python可变对象/不可变对象 原型继承
- IE push方法,最后一个参数后面不能跟",",否则报语法错误
var columns = [[]]; columns[0].push( { field: 'ADDNAME', title: '添加人', width: 80, }, { field: 'ADDDT ...
- SELinux 是什么?
一.SELinux的历史 SELinux全称是Security Enhanced Linux,由美国国家安全部(National Security Agency)领导开发的GPL项目,它拥有一个灵活而 ...
- PCA与KPCA
PCA是利用特征的协方差矩阵判断变量间的方差一致性,寻找出变量之间的最佳的线性组合,来代替特征,从而达到降维的目的,但从其定义和计算方式中就可以看出,这是一种线性降维的方法,如果特征之间的关系是非线性 ...
- Orcale新增、修改、删除字段
一.新增字段 alert table user add( userName VARCHAR2(255 CHAR) ) ; 设置字段不为空, 给出默认值 alert table user add( us ...
- row_number() over() 一句话概括,以及max()函数的一种查询分组中最大值的用法
row_number() over(partition by col1 order by col2) 根据COL1分组可能会有多个组,每组组内根据COL2进行排序.每组内都有自动生成的序号,从1开始, ...
- Reachability
一.Reachability中介绍了取得/检测网络状态的方法. 二.使用 1.添加源文件:Reachability.h和Reachability.m 2.添加framework———SystemCon ...
- ECstore后台报表显示空白问题解决办法
执行如下sql语句: INSERT INTO `sdb_ectools_analysis` (`id`, `service`, `interval`, `modify`) VALUES (1, 'b2 ...
- 面转栅格之ERROR 999999:执行函数时出错
今天进行矢量面转栅格的操作时,总是出现ERROR 999999:执行函数时出错,如下图所示: 刚开始以为是栅格保存的路径太长的问题,后来发现是矢量面的路径问题,我的矢量面是放在自建的图层组下面,如下图 ...