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.简单:支 ...
随机推荐
- 将 Azure 文件共享用于 Windows VM
可将 Azure 文件共享用作一种从 VM 中存储和访问文件的方式. 例如,你可以存储一个要与所有 VM 共享的脚本或应用程序配置文件. 本主题将介绍如何创建和装载 Azure 文件共享,以及如何上传 ...
- Java ——基础语法
package myhello; // 本类所在的包的路径 import af.util.AfMath; // 导入对应的类 import java.util.Random; // 导入随机数的类 p ...
- BootStrap DateTimePicker的使用
使用方法 1. 添加资源 2. 编写代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Conte ...
- Fedroa 28 php 和 mail 命令,邮件发不出去
问题:在配置服务中,发现本地命令mail 和 php 邮件函数的邮件发送不出去. 解决方案: 安装 MTA 服务: postfix , sendmail 等. MTA 为 邮件传输代理 想要了解Lin ...
- 用Python实现数据结构之链表
链表 链表与栈,队列不一样,它是由一个个节点构成的,每个节点存储着本身的一些信息,也存储着其他一个或多个节点的引用,可以从一个节点找到其他的节点,节点与节点之间就像是有链连在一起一样,这种数据结构就叫 ...
- [HDFS_add_3] HDFS 机架感知
0. 说明 HDFS 副本存放策略 && 配置机架感知 1. HDFS 的副本存放策略 HDFS 的副本存放策略是将一个副本存放在本地机架节点上,另外两个副本放在不同机架的不同节点上 ...
- Windows结构化异常处理浅析
近期一直被一个问题所困扰,就是写出来的程序老是出现无故崩溃,有的地方自己知道可能有问题,但是有的地方又根本没办法知道有什么问题.更苦逼的事情是,我们的程序是需要7x24服务客户,虽然不需要实时精准零差 ...
- 深入理解Java的堆内存和线程内存
我们都知道Java对象都是在堆中创建的(开启逃逸分析的情况除外),比如一个线程中有一段这样的代码: public class A{ public int xxx; } 通过A a = new A(); ...
- vue_模板渲染
渲染 当获取到后端数据后,我们会把它按照一定的规则加载到写好的模板中,输出成在浏览器中显示的HTML,这个过程就称之为渲染. vue.js是在前端(即浏览器内)进行的模板渲染. 前后端渲染对比 前端渲 ...
- luogu P5151 HKE与他的小朋友
嘟嘟嘟 看到\(i\)变成了\(A_i\),我突然想起了置换这个东西.于是马上到网上学了一遍轮换乘法. 手模后发现轮换乘法满足结合律,但不满足交换律. 于是就可以快速幂啦. 需要注意的是每一次相乘是\ ...