zoukankan      html  css  js  c++  java
  • quartz.net动态添加job

    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

  • 相关阅读:
    【Codeforces】【161Div2】
    【ZOJ月赛】【树形DP】【I.Destroy】
    【Baltic 2001远程通信】
    【树形DP】【分组背包】【HDU1561】
    【差分约束系统】【仍未AC】【Asia Harbin 2010/2011】【THE MATRIX PROBLEM】
    【DP】【2012 ACM/ICPC 成都赛区现场赛】【I.Count】
    【ZOJ月赛】【二分查找】【A.Edward's Cola Plan】
    【DP】【单调队列多重背包】
    【树形依赖背包】
    SQL 格式
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4234243.html
Copyright © 2011-2022 走看看