quartz.net动态添加job设计-(五)

介绍

在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布。

也看到有园子的同学问过。这里就介绍下实现动态添加job的几种方式, 也是二次开发的核心模块。

目录

一:传统方式

二:框架反射方式

三:进程方式

四:URL方式

五:框架配置方式

六:总结

一:传统方式

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

时间: 2024-10-01 07:58:25

quartz.net动态添加job设计-(五)的相关文章

一个Spring Scheduler (Quartz) 动态添加,删除,修改任务的例子

要求 根据任务清单执行不定数量,不定频率的定时任务.并且需要动态添加,删除,修改任务. 代码 public class JobExample {      public static void main(String[] args) throws Exception {         // Job的配置信息,可以从数据库或配置文件中获取         List<JobParameter> list = new ArrayList<JobParameter>();        

Quartz任务调度[Spring+Quartz结合]_实现任务的动态添加、修改和删除

项目框架图 下面开始贴代码了,不过先贴数据库^^ -- Create table Oracle数据库 create table QUARTZ_SCHEDULEJOB ( id VARCHAR2(32), job_name VARCHAR2(32) not null, job_status NVARCHAR2(3) default 0 not null, cron_expression NVARCHAR2(32) not null, concurrent NVARCHAR2(3) default

Quartz 2.2 动态添加、修改和删除定时任务

QuartzManager.Java 动态添加.修改和删除定时任务管理类 import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.Job; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import

Quartz动态添加、修改和删除定时任务

任务调度开源框架Quartz动态添加.修改和删除定时任务 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触发器监听.你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听.Quartz 允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联.整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业.并且还

springboot整合Quartz实现动态配置定时任务

前言 在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能. 一.新建一个springboot工程,并添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>

js实现表格行的动态添加------Day56

现代页面通常都是用div+css来进行设计,几乎很少再有用table来进行布局的了,但是这并不意味着table的重要性就降低了,事实上,table在数据处理上有着它独特的优势,所以对table的掌握还是很有必要的. 我们首先要记录的问题是:js动态的添加表格的行和列 我们先给定一个table,先用html语言编写下: <table width="100%" height="300px" border="1px" id="tad&q

js对select动态添加和删除OPTION

<select id="ddlResourceType" onchange="getvalue(this)"> </select> 动态删除select中的所有options: document.getElementById("ddlResourceType").options.length=0; 动态删除select中的某一项option: document.getElementById("ddlResourc

jquery版小型婚礼(可动态添加祝福语)

原文:jquery版小型婚礼(可动态添加祝福语) 前两天在网上不小心看到“js许愿墙”这几个字,我的神经就全部被调动了.然后就开始我的百度生涯,一直寻觅许愿墙背景图片和便利贴图片,觅了好久……一直没找到满意的……无意间看到祝福语和一些卡通婚礼图片.最终我决定用jquery制作一个小型婚礼,并且实现添加祝福语的功能. 音乐响起来,开始我的婚礼进行曲~ 一.婚礼演示图 场景一: 场景二: 场景三: 场景四: 场景五: 场景六: 场景七: 添加祝福语: 二.html代码 <div class="

在CFormView或对话框中动态添加CScrollView、CFormView

在CFormView或对话框中动态添加CScrollView.CFormView 本代码可以在CFormView中,根据事先画好的控件位置创建CScrollView 也可以在CDialog中创建CScrollView.CFormView等 注: 若以下代码放在CMainRightView::OnCreate(LPCREATESTRUCT lpCreateStruct)内,则GetDlgItem()函数将调用失败,因为此时控件都还未被创建! void CMainRightView::OnIniti