感谢@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分布式任务管理平台(续)的更多相关文章

  1. Quartz.Net分布式任务管理平台

           无关主题:一段时间没有更新文章了,与自己心里的坚持还是背驰,虽然这期间在公司做了统计分析,由于资源分配问题,自己或多或少的原因,确实拖得有点久了,自己这段时间也有点松懈,借口就不说那么多 ...

  2. Quartz.Net分布式任务管理平台(第二版)

    前言:在Quartz.Net项目发布第一版后,有挺多园友去下载使用,我们通过QQ去探讨,其中项目中还是存在一定的不完善.所以有了现在这个版本.这个版本的编写完成其实有段时间了一直没有放上去.现在已经同 ...

  3. Quart.Net分布式任务管理平台

           无关主题:一段时间没有更新文章了,与自己心里的坚持还是背驰,虽然这期间在公司做了统计分析,由于资源分配问题,自己或多或少的原因,确实拖得有点久了,自己这段时间也有点松懈,借口就不说那么多 ...

  4. Quart.Net分布式任务管理平台(续)

           感谢@Taking园友得建议,我这边确实多做了一步上传,导致后面还需处理同步上传到其他服务器来支持分布式得操作.所有才有了上篇文章得完善. 首先看一下新的项目结构图: 这个图和上篇文章中 ...

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

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

  6. Quartz.net 的开源任务管理平台

    Quartz.net 的开源任务管理平台 前面总结了很多,关于Quartz.net 的文章,介绍了如何使用Quartz.net.不清楚的朋友,可以看我之前的系列文章,http://www.cnblog ...

  7. 转载《分布式任务调度平台XXL-JOB》

    <分布式任务调度平台XXL-JOB>       博文转自 https://www.cnblogs.com/xuxueli/p/5021979.html 一.简介 1.1 概述 XXL-J ...

  8. 分布式任务调度平台XXL-JOB

    <分布式任务调度平台XXL-JOB>       一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并 ...

  9. 《分布式任务调度平台XXL-JOB》

    一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 1.2 特性 1.简单:支 ...

随机推荐

  1. k-means算法之见解(一)

    k-menas算法之见解 主要内容: 一.引言 二.k-means聚类算法 一.引言: 先说个K-means算法很高大上的用处,来开始新的算法学习.美国竞选总统,选票由公民投出,总统由大家决定.在20 ...

  2. Vim命令图解及快捷键讲解

    快捷键详解

  3. golang的定时任务

    golang的定时任务使用的是cron这个包来解决的 官方文档地址:https://godoc.org/github.com/robfig/cron cron包的基础知识 字段名 是否必须 允许的值 ...

  4. Appium1.9.1 部署及结果检验

    1.官网下载最新的 appium 2.点击 Download Appium 3.选择适用于自己操作系统的版本,我的是 windows版本,就选择如下红圈起的 4.点击安装,一直点 下一步 直到提示安装 ...

  5. hadoop系列 第三坑: Task process exit with nonzero status of 137

    跑MR的时候抛出异常: java.lang.Throwable: Child Error at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.j ...

  6. el-table表格标题换行

    在做一些管理后台的项目中,表格时最常见的,当有时数据字段多时往往会用滚动条,但从用户体验角度讲,肯定需要多展示信息,那么可能需要一个单元格放多个字段,这时候表头就需要换行. 具体实现如下: // 注意 ...

  7. Linux基础第四课——文件操作

    文件的创建 touch sudo touch 文件1 文件2 文件3 #支持批量创建文件 sudo rm -f 文件1 文件2 文件3 #支持批量创建 也支持批量删除 echo '谁动谁输,对不起我输 ...

  8. hashCode相关性能优化

    学习下hashMap中用到的关于hashCode性能优化技巧.作为笔记.为之后并发深入作基础. 1.关于提高性能的hash算法 在被模的位数为2的n次方时,用位与取代效率低下的模运算.位与效率相比模运 ...

  9. 2080 特殊的质数肋骨 USACO (深度优先搜索)

    农民约翰的母牛总是产生最好的肋骨. 你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们. 农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个 ...

  10. Domain Adaptation (1)选题讲解

    1 所选论文 论文题目: <Unsupervised Domain Adaptation with Residual Transfer Networks> 论文信息: NIPS2016, ...