Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递

简介: 在Quartz.NET中可以用JobDataMap进行参数传递。本例用Quartz.NET的任务来定期轮询数据库表,当数据库的条目达到一定的数目后,进行预警。

  前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Contex)进行参数传递 , 有些参数想保存状态该如何处理 。 在Quartz.NET中可以用JobDataMap进行参数传递。本例用Quartz.NET的任务来定期轮询数据库表,当数据库的条目达到一定的数目后,进行预警。(其实可以将读取的表和预警条件配置到数据库中的预警条件表中,这样就可以简单实现一个自动预警提醒的小平台)。

1 JobWithParametersExample


usingSystem;
usingSystem.Threading;
usingCommon.Logging;
usingQuartz;
usingQuartz.Impl;
usingQuartz.Job;
usingQuartz.Impl.Calendar;
usingQuartz.Impl.Matchers;
namespaceQuartzDemo{
publicclassJobWithParametersExample    {
publicstringName        {
get { returnGetType().Name; }
        }
privateISchedulersched=null;
publicJobWithParametersExample(IScheduler_sched)
        {
sched=_sched;
        }
publicvirtualvoidRun()
        {
//2S后执行DateTimeOffsetstartTime=DateBuilder.NextGivenSecondDate(null, 2);
IJobDetailjob1=JobBuilder.Create<JobWithParameters>()
                .WithIdentity("job1", "group1")
                .Build();
ISimpleTriggertrigger1= (ISimpleTrigger)TriggerBuilder.Create()
                       .WithIdentity("trigger1", "group1")
                       .StartAt(startTime)
                       .WithSimpleSchedule(x=>x.WithIntervalInSeconds(5).WithRepeatCount(100))
                       .Build();
// 设置初始参数job1.JobDataMap.Put(JobWithParameters.tSQL, "SELECT * FROM [ACT_ID_USER]");
job1.JobDataMap.Put(JobWithParameters.ExecutionCount, 1);
// 设置监听器JobListenerlistener=newJobListener();
IMatcher<JobKey>matcher=KeyMatcher<JobKey>.KeyEquals(job1.Key);
sched.ListenerManager.AddJobListener(listener, matcher);
// 绑定trigger和jobsched.ScheduleJob(job1, trigger1);
//启动sched.Start();
        }
    }
}

  JobWithParametersExample用来配置job和trigger,同时定义了一个监听器,来监听定义的job.

2 JobWithParameters


usingSystem;
usingCommon.Logging;
usingQuartz;
usingQuartz.Impl;
usingQuartz.Job;
usingSystem.Windows.Forms;
namespaceQuartzDemo{
    [PersistJobDataAfterExecution]
    [DisallowConcurrentExecution]
publicclassJobWithParameters : IJob    {
// 定义参数常量publicconststringtSQL="tSQL";
publicconststringExecutionCount="count";
publicconststringRowCount="rowCount";
publicconststringtableAlert="tAlert";
//  Quartz 每次执行时都会重新实例化一个类, 因此Job类中的非静态变量不能存储状态信息privateintcounter=1;//都为1//private static  int counter = 1;//可以保存状态publicvirtualvoidExecute(IJobExecutionContextcontext)
        {
JobKeyjobKey=context.JobDetail.Key;
// 获取传递过来的参数JobDataMapdata=context.JobDetail.JobDataMap;
stringSQL=data.GetString(tSQL);
intcount=data.GetInt(ExecutionCount);
if (isOpen("FrmConsole"))
            {
try                {
//获取当前Form1实例__instance= (FrmConsole)Application.OpenForms["FrmConsole"];
//获取当前执行的线程ID__instance.SetInfo(jobKey+"Thread ID "+System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
//数据库操作System.Data.DataTabletAlert=SqlHelper.getDateTable(SQL, null);
//回写条数data.Put(RowCount, tAlert.Rows.Count);
//通过方法更新消息__instance.SetInfo(string.Format("{0} exec {1} = {2} get {3} rows\r\n           execution count (from job map) is {4}\r\n           execution count (from job member variable) is {5}",
jobKey,
tSQL,
SQL,
tAlert.Rows.Count,
count, counter));
//怎么取出Datatable ? json to datatable//data.Put(tableAlert, tAlert);                }
catch (Exceptionex)
                {
Console.WriteLine(ex.Message);
                }
            }
// 修改执行计数并回写到job data map中count++;
data.Put(ExecutionCount, count);
// 修改本地变量,如果是非静态变量,不能存储状态counter++;
        }
privatestaticFrmConsole__instance=null;
/// <summary>/// 判断窗体是否打开/// </summary>/// <param name="appName"></param>/// <returns></returns>privateboolisOpen(stringappName)
        {
FormCollectioncollection=Application.OpenForms;
foreach (Formformincollection)
            {
if (form.Name==appName)
                {
returntrue;
                }
            }
returnfalse;
        }
    }
}

Quartz 每次执行时都会重新实例化一个类, 因此Job类中的非静态变量不能存储状态信息.如何要保存状态信息可以用静态变量进行处理,也可以用参数值进行传入传出来实现。

3 JobListener


下面通过实现一个接口IJobListener来完成监听器,其中包含任务执行前、执行中和执行后的方法,可以在对应方法中根据业务场景来进行定制,相关示例如下所示:

usingSystem;
usingCommon.Logging;
usingQuartz;
usingQuartz.Impl;
usingQuartz.Job;
namespaceQuartzDemo{
publicclassJobListener : IJobListener    {
publicvirtualstringName        {
get { return"JobListener"; }
        }
publicvirtualvoidJobToBeExecuted(IJobExecutionContextinContext)
        {
//执行前执行Console.WriteLine("JobToBeExecuted");
        }
publicvirtualvoidJobExecutionVetoed(IJobExecutionContextinContext)
        {
//否决时执行Console.WriteLine("JobExecutionVetoed");
        }
publicvirtualvoidJobWasExecuted(IJobExecutionContextinContext, JobExecutionExceptioninException)
        {
JobKeyjobKey=inContext.JobDetail.Key;
// 获取传递过来的参数JobDataMapdata=inContext.JobDetail.JobDataMap;
//获取回传的数据库表条目数introwCount=data.GetInt(JobWithParameters.RowCount);
try            {
if (rowCount>9)
                {
inContext.Scheduler.PauseAll();
System.Windows.Forms.MessageBox.Show("预警已超9条");
inContext.Scheduler.ResumeAll();
                }
Console.WriteLine(rowCount.ToString());
            }
catch (SchedulerExceptione)
            {
Console.Error.WriteLine(e.StackTrace);
            }
        }
    }
}

4 效果


执行此示例,修改相关的数据,预警规则定期执行,则巡检数据,如有符合预警的数据,则进行预警。具体如下图所示:

2.jpg

76497-20151203094439986-1201066541.gif

相关文章
|
11天前
|
消息中间件 开发框架 监控
NET任务调度框架Hangfire使用指南
Hangfire 是一个用于 .NET 应用程序的开源任务调度框架,支持长时间运行任务、定时任务等。通过简单的安装配置,即可将任务从主线程分离,提升应用性能。支持多种数据库,提供丰富的任务类型如立即执行、延迟执行和周期性任务,并有可视化管理界面 Hangfire Dashboard。还支持安全性配置及扩展插件,如 Hangfire.HttpJob,适合各种复杂场景下的任务调度需求。
37 1
NET任务调度框架Hangfire使用指南
|
1月前
|
开发框架 安全 .NET
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱。它不仅加速了应用开发进程,提升了开发质量和可靠性,还促进了创新和业务发展,培养了专业人才和技术社区,为软件开发和数字化转型做出了重要贡献。
24 5
|
1月前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
32 4
|
1月前
|
开发框架 .NET C#
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位。从企业应用到电子商务,再到移动开发,.NET 均展现出卓越性能,助力开发者提升效率与项目质量,推动行业持续发展。
29 4
|
1月前
|
开发框架 Java .NET
.net core 非阻塞的异步编程 及 线程调度过程
【11月更文挑战第12天】本文介绍了.NET Core中的非阻塞异步编程,包括其基本概念、实现方式及应用示例。通过`async`和`await`关键字,程序可在等待I/O操作时保持线程不被阻塞,提高性能。文章还详细说明了异步方法的基础示例、线程调度过程、延续任务机制、同步上下文的作用以及如何使用`Task.WhenAll`和`Task.WhenAny`处理多个异步任务的并发执行。
|
1月前
|
消息中间件 监控 数据可视化
基于.NET开源、功能强大且灵活的工作流引擎框架
基于.NET开源、功能强大且灵活的工作流引擎框架
|
1月前
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
48 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
75 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
56 0