quartz.net动态添加job
quartz.net动态添加job设计-(五)
介绍
在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布。
也看到有园子的同学问过。这里就介绍下实现动态添加job的几种方式, 也是二次开发的核心模块。
目录
一:传统方式
1: 继承IJob,实现业务逻辑,添加到scheduler。

public class MonitorJob : IJob
{
public void Execute(IJobExecutionContext context)
{
//do something
Console.WriteLine("test");
}
}
//var job = JobBuilder.Create<MonitorJob>()
// .WithIdentity("test", "value")
// .Build();
//var trigger = (ICronTrigger) TriggerBuilder.Create()
// .WithIdentity("test", "value")
// .WithCronSchedule("0 0/5 * * * ?")
// .Build();
//scheduler.ScheduleJob(job, trigger);

也可以使用CrystalQuartz远程管理暂停取消。之前的博客CrystalQuartz远程管理(二)。
二:框架反射方式
这种方式需要定义一套接口框架。 比如:
interface IcustomJob
{
void Excute(string context);
void Failed(string error);
void Complete(string msg);
}
1:当我们写job时同一实现这个框架接口,类库形式。
2:写完后编译成DLL,上传到我们的作业执行节点。
3:在执行节点中,通过反射拿到DLL的job信息。
4:然后构建quartz的job,添加到scheduler。
这种方式缺点: 耦合性太高,开发量较大。 优点:集中式管理。
系统结构如图:

三:进程方式
这个方式和windows任务计划类似。
1:使用方编写自己的job,无需实现任何接口,可执行应用程序形式。
2:将程序发送到执行节点,由执行节点起进程调用job程序。
执行节点调用,示例如下:

public class ConsoleJob:IJob
{
public void Execute(IJobExecutionContext context)
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
string content = dataMap.GetString("jobData");
var jd = new JavaScriptSerializer().Deserialize<ConsoleJobData>(content); Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = jd.Path;
p.StartInfo.Arguments = jd.Parameters; //空格分割
p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
p.Start();
}
}

这种方式相对来说: 耦合性中等,执行节点和job相互不关心,没有依赖,开发量较小。
系统结构如图:

四:URL方式
URL方式和第三种类似,不过调用的不在是执行程序,而是URL。
1: 使用方在网页或服务中,实现业务逻辑。
2: 然后将Url,交给执行节点post或get执行。
执行节点调用,示例如下:

public class HttpJob : IJob
{
public void Execute(IJobExecutionContext context)
{
var dataMap = context.JobDetail.JobDataMap; var content = dataMap.GetString("jobData"); var jd = new JavaScriptSerializer().Deserialize<HttpJobData>(content); if (jd.Parameters == null)
jd.Parameters = string.Empty;
if (jd.Timeout == 0)
jd.Timeout = 5*60; var result = RequestHelper.Post(jd.Url, jd.ContentType, jd.Timeout, jd.Parameters, jd.heads);
}
}

这种方式耦合比较低,使用方不需要单独写应用程序了,就和平常业务开发一样的啦。 执行节点的职权:仅仅作为一个触发器。
有2点需要注意:
1:请求URL时,注意双方约定token加密,防止非执行节点执行调用。
2:使用方,如果有耗时操作,建议异步执行。
系统结构如图:

五:框架配置方式
1:使用方直接使用quartz.net框架,实现自己的job。从管理方拉取执行节点配置,然后自行管理执行节点。
2:使用方也可以暴露端口给管理方,以实现监控,修改配置。
这种形式,耦合性最低。是把管理方当成一个配置中心。 ps:几乎和传统方式+CrystalQuartz一样了。

六:总结
通过context.JobDetail.JobDataMap,我们可以保存job的需要的信息。
提出几种方案,给需要的同学参考用。对您有帮助的,请推荐下 n(*≧▽≦*)n。
作者:蘑菇先生 出处:http://www.cnblogs.com/mushroom/p/4231834.html
quartz.net动态添加job的更多相关文章
- Net作业调度(五)—quartz.net动态添加job设计
介绍 在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布. 也看到有园子的同学问过.这里就介绍下实现动态添加job的几种方式, 也是二次开发的核心模 ...
- Spring+Quartz实现动态添加定时任务
发布时间:2018-12-03 技术:spring4.0.2+quartz2.2.1 概述 在最近工作中,由于涉及到定时任务特别多,而这些工作又是由下属去完成的,在生成环境中经常会出现业务逻辑 ...
- 动态添加定时任务-quartz定时器
Quartz动态添加.修改和删除定时任务 在项目中有一个需求,需要灵活配置调度任务时间,刚开始用的Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务 ...
- Quartz动态添加、修改和删除定时任务
任务调度开源框架Quartz动态添加.修改和删除定时任务 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触 ...
- Quartz 2.2 动态添加、修改和删除定时任务
QuartzManager.Java 动态添加.修改和删除定时任务管理类 import org.quartz.CronScheduleBuilder; import org.quartz.CronTr ...
- Quartz动态添加定时任务执行sql(服务启动添加+手动添加)
系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...
- Quartz动态添加,修改,删除任务(暂停,任务状态,恢复,最近触发时间)
首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat 写博客 小程序 消息 登录注册 关闭 quartz_Cron表达式一分钟教程 09-05 ...
- Quartz 2.3 动态添加、修改和删除定时任务
下面直接上代码: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>qu ...
- Quartz-Spring定时任务器持久化,通过Service动态添加,删除,启动暂停任务
原文地址:https://blog.csdn.net/ljqwstc/article/details/78257091 首先添加maven的依赖: <!--quartz定时任务--> &l ...
随机推荐
- 大约Java有点感悟---开发商根本上感悟学习
这些年来一直从事大C.C++,有些局部底.一直想知道更多关于顶级什么. 所以,在工作之余.阅读更多Java哪些方面,还使用了一些建筑结构的一些简单的程序,在这里我想简单谈谈自己的一点感悟. 1.Jav ...
- P/Invoke与逆向P/Invoke
1.在在 C# 中通过 P/Invoke 调用Win32 DLL这篇文中,详细介绍了P/Invoke的基本知识以及使用. 2.InAttribute和OutAttribute特性与C#中ref和out ...
- poj3414--Pots(bfs,记录路径)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10149 Accepted: 4275 Special J ...
- MapReduce 规划 系列十 采用HashPartitioner调整Reducer计算负荷
example4它演示了如何指定Reducer号码,本节演示如何使用HashPartitioner将Mapper根据该输出key分组后Reducer为了应对. 合理的分组策略会尽一切Reducer不能 ...
- ubuntu 下安装 matplotlib
直接使用sudo easy_install matplotlib 报错 ================================================================ ...
- Unity3d 镜面反射 vertex and frag Shader源代码
Unity3d 镜面反射 网上能找到的基本上是固定管道或表面渲染的shader. 特此翻译为顶点.片段渲染的Shader, 本源代码仅仅涉及shader与cs部分. Editor部分使用NGUI绘制的 ...
- hdu4453 Looploop 2012年杭州现场赛 Splay
题意:维护一个圈,实现六个功能,给某位置起的一些数增加某值,反转某一段数,添加删除某些数,移动当前所指的位置, 简单的splay,把圈拆成链,对于每种操作,处理一下. #define inf 0x3f ...
- EXCEL 两人的建立Y轴
在本文中,EXCEL2013基于,操作的其他版本基本上相同模式 原始数据和最后的结果如下面的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanloX2p ...
- mysql三学习sql声明学习
SQL 是一门 ANSI 的标准计算机语言,用来訪问和操作数据库系统.SQL 语句用于取回和更新数据库中的数据.SQL 可与数据库程序协同工作,比方MySQL. MS Access.DB2.Infor ...
- 十天学Linux内核之第十天---总结篇(kconfig和Makefile & 讲不出再见)
原文:十天学Linux内核之第十天---总结篇(kconfig和Makefile & 讲不出再见) 非常开心能够和大家一起分享这些,让我受益匪浅,感激之情也溢于言表,,code monkey的 ...