感谢@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负载就可以了

Quart.Net分布式任务管理平台(续)的更多相关文章

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

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

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

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

  3. Quartz.Net分布式任务管理平台(续)

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

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

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

  5. 开源任务管理平台TaskManager介绍

    很早之前准备写Quartz系列文章,现在终于能够实现了.从本篇开始将带你实现一款自己的任务管理平台.在工作中你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一 ...

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

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

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

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

  8. 分布式任务调度平台XXL-JOB搭建教程

    关于分布式任务调度平台XXL-JOB,其实作者 许雪里 在其发布的中文教程中已经介绍的很清楚了,这里我就不做过多的介绍了,关于其搭建教程,本人依照其文档搭建起来基本上也没遇到啥问题,这里通过博客的形式 ...

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

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

随机推荐

  1. 【转】MySQL分库分表环境下全局ID生成方案

    转载一篇博客,里面有很多的知识和思想值得我们去思考. —————————————————————————————————————————————————————————————————————— 在大 ...

  2. Struts框架2

    1.框架:是一个半成品,可以在其基础上在次开发. 2.struts2框架:它是一个web层使用的mvc框架. 3.struts2核心 1.struts2核心 2.xwork核心 4.struts2入门 ...

  3. [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

    关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...

  4. 解决在Ubuntu终端下使用cURL获取GBK格式的页面出现乱码问题

    问题描述 在Ubuntu下使用终端使用cURL去拿一个GBK的页面,发现返回来的内容里面中文都是乱码 解决方法 通过iconv来处理乱码拿到的内容,进行转码,示例如下: $curl http://ww ...

  5. 【】小技巧】CSS文字两端对齐

    需求如下,红框所在的文字有四个字的.三个字的.两个字的,如果不两端对齐可以选择居中对齐,或者右对齐.但是如果要像下面这样两端对齐呢? 我相信以前很多人都这么干过:两个字中间使用 来隔开达到四个字的宽度 ...

  6. angular 自定义指令详解 Directive

    在angular中,Directive,自定义指令的学习,可以更好的理解angular指令的原理,当angular的指令不能满足你的需求的时候,嘿嘿,你就可以来看看这篇文章,自定义自己的指令,可以满足 ...

  7. 翻译:MariaDB wait/nowait

    本文为mariadb官方手册:wait/nowait的译文.原文:https://mariadb.com/kb/en/library/wait-and-nowait/ 从MariaDB 10.3.0开 ...

  8. socket端口外网无法连接解决方法

    用socket做了个程序,本地测试没有问题,发布到服务器上时连接不上,用telnet测试连接失败 服务器上netstat -a 查看端口情况,127.0.0.1绑定端口9300处于监听状态,如下图: ...

  9. TEXT宏

    TEXT宏是windows程序设计中经常遇到的宏,定义在 <winnt.h>中 TCHAR *P = TEXT("this is a const string"); 如 ...

  10. win7旗舰版最新激活密钥

    Win7旗舰.企业.专业版的激活密钥(32位.64位均可用).FJGCP-4DFJD-GJY49-VJBQ7-HYRR2 AcerVQ3PY-VRX6D-CBG4J-8C6R2-TCVBD Alien ...