Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递
前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Contex)进行参数传递 , 有些参数想保存状态该如何处理 . 在Quartz.NET中可以用JobDataMap进行参数传递.本例用Quartz.NET的任务来定期轮询数据库表,当数据库的条目达到一定的数目后,进行预警.(其实可以将读取的表和预警条件配置到数据库中的预警条件表中,这样就可以简单实现一个自动预警提醒的小平台).
1 JobWithParametersExample
using System;
using System.Threading; using Common.Logging;
using Quartz;
using Quartz.Impl;
using Quartz.Job;
using Quartz.Impl.Calendar;
using Quartz.Impl.Matchers;
namespace QuartzDemo
{ public class JobWithParametersExample
{
public string Name
{
get { return GetType().Name; }
}
private IScheduler sched = null;
public JobWithParametersExample(IScheduler _sched)
{
sched = _sched;
}
public virtual void Run()
{ //2S后执行
DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, );
IJobDetail job1 = JobBuilder.Create<JobWithParameters>()
.WithIdentity("job1", "group1")
.Build(); ISimpleTrigger trigger1 = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithIntervalInSeconds().WithRepeatCount())
.Build(); // 设置初始参数
job1.JobDataMap.Put(JobWithParameters.tSQL, "SELECT * FROM [ACT_ID_USER]");
job1.JobDataMap.Put(JobWithParameters.ExecutionCount, ); // 设置监听器
JobListener listener = new JobListener();
IMatcher<JobKey> matcher = KeyMatcher<JobKey>.KeyEquals(job1.Key);
sched.ListenerManager.AddJobListener(listener, matcher); // 绑定trigger和job
sched.ScheduleJob(job1, trigger1);
//启动
sched.Start(); }
}
}
JobWithParametersExample用来配置job和trigger,同时定义了一个监听器,来监听定义的job.
2 JobWithParameters
using System;
using Common.Logging;
using Quartz;
using Quartz.Impl;
using Quartz.Job;
using System.Windows.Forms;
namespace QuartzDemo
{ [PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class JobWithParameters : IJob
{ // 定义参数常量
public const string tSQL = "tSQL";
public const string ExecutionCount = "count";
public const string RowCount = "rowCount";
public const string tableAlert = "tAlert";
// Quartz 每次执行时都会重新实例化一个类, 因此Job类中的非静态变量不能存储状态信息
private int counter = ;//都为1
//private static int counter = 1;//可以保存状态
public virtual void Execute(IJobExecutionContext context)
{ JobKey jobKey = context.JobDetail.Key;
// 获取传递过来的参数
JobDataMap data = context.JobDetail.JobDataMap;
string SQL = data.GetString(tSQL);
int count = 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.DataTable tAlert = 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 (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
// 修改执行计数并回写到job data map中
count++;
data.Put(ExecutionCount, count);
// 修改本地变量,如果是非静态变量,不能存储状态
counter++;
} private static FrmConsole __instance = null; /// <summary>
/// 判断窗体是否打开
/// </summary>
/// <param name="appName"></param>
/// <returns></returns>
private bool isOpen(string appName)
{
FormCollection collection = Application.OpenForms;
foreach (Form form in collection)
{
if (form.Name == appName)
{
return true;
}
}
return false;
} }
}
Quartz 每次执行时都会重新实例化一个类, 因此Job类中的非静态变量不能存储状态信息.如何要保存状态信息可以用静态变量进行处理,也可以用参数值进行传入传出来实现.
3 JobListener
using System;
using Common.Logging;
using Quartz;
using Quartz.Impl;
using Quartz.Job;
namespace QuartzDemo
{
public class JobListener : IJobListener
{ public virtual string Name
{
get { return "JobListener"; }
} public virtual void JobToBeExecuted(IJobExecutionContext inContext)
{
//执行前执行
Console.WriteLine("JobToBeExecuted");
} public virtual void JobExecutionVetoed(IJobExecutionContext inContext)
{
//否决时执行
Console.WriteLine("JobExecutionVetoed");
} public virtual void JobWasExecuted(IJobExecutionContext inContext, JobExecutionException inException)
{
JobKey jobKey = inContext.JobDetail.Key;
// 获取传递过来的参数
JobDataMap data = inContext.JobDetail.JobDataMap;
//获取回传的数据库表条目数
int rowCount = data.GetInt(JobWithParameters.RowCount); try
{
if (rowCount > )
{
inContext.Scheduler.PauseAll();
System.Windows.Forms.MessageBox.Show("预警已超9条");
inContext.Scheduler.ResumeAll(); }
Console.WriteLine(rowCount.ToString());
}
catch (SchedulerException e)
{ Console.Error.WriteLine(e.StackTrace);
}
} }
}
4 效果


Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递的更多相关文章
- Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递-转
前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Conte ...
- Quartz.NET开源作业调度框架系列
Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...
- Quartz.NET开源作业调度框架系列(一):快速入门step by step
Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...
- Quartz.NET开源作业调度框架系列(一):快速入门step by step-转
Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...
- Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库
Quartz.NET 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger(用于定义调度时间的元素,即按照什么时间规则去执行任务) 和 job 是任务调度的元数 ...
- Quartz.NET开源作业调度框架系列(四):Plugin Job
如果在Quartz.NET作业运行时我们想动态修改Job和Trigger的绑定关系,同时修改一些参数那么该怎么办呢?Quartz.NET提供了插件技术,可以通过在XML文件中对Job和Trigger的 ...
- Quartz.NET开源作业调度框架系列(四):Plugin Job-转
如果在Quartz.NET作业运行时我们想动态修改Job和Trigger的绑定关系,同时修改一些参数那么该怎么办呢?Quartz.NET提供了插件技术,可以通过在XML文件中对Job和Trigger的 ...
- Quartz.NET开源作业调度框架系列(二):CronTrigger
CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜 ...
- Quartz.NET开源作业调度框架系列(二):CronTrigger-转
CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜 ...
随机推荐
- 【WP开发】WebView控件应用要点
WebView控件我就不多作详细的介绍,相信大家都懂的,就算你没用过,你看他的名字和长相都知道它的用途了.就是用来显示HTML内容的. 在WP 8.1的Runtime App中,这个控件大致有以下几个 ...
- 为大家分享一个 Ajax Loading —— spin.js
我们在做Ajax 异步请求的时候,一般都会利用一个动态的 Gif 小图片来制作一个Ajax Loading ,以便增加用户体验. 今天在网上发现了一个 Spin.js ,该 js 脚本压缩后5k,可以 ...
- javaweb -- 获取请求IP(附实现源码)
实现步骤如下: (1)新建一个java web工程 (2)新建servers包,新建类GetRequestIp,用来处理获取请求IP,GetRequestIp类完整代码如下: package serv ...
- mysql命令详解
mysqld.exe 和 mysql.exe 有什么区别? mysqld.exe 是MySQL后台程序(即MySQL服务器).要想使用客户端程序,该程序必须运行,因为客户端通过连接服务器来访问数据库. ...
- 赞!15个来自 CodePen 的酷炫 CSS 动画效果
CodePen 是一个在线的前端代码编辑和展示网站,能够编写代码并即时预览效果.你在上面可以在线分享自己的 Web 作品,也可以欣赏到世界各地的优秀开发者在网页中实现的各种令人惊奇的效果. 今天这篇文 ...
- Google C++ 风格指南 命名约定 转
命名约定 最重要的一致性规则是命名管理. 命名风格快速获知名字代表是什么东东: 类型? 变量? 函数? 常量? 宏 ... ? 甚至不需要去查找类型声明. 我们大脑中的模式匹配引擎可以非常可靠的处理这 ...
- HT For Web 拓扑图背景设置
HT For Web 的HTML5拓扑图组件graphView背景设置有多种途径可选择: divBackground:通过css设置graphView对应的div背景 Painter:通过graphV ...
- C#以管理员身份运行程序
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; names ...
- VS自动生成的packages.config配置文件有什么用?
通过nuget管理安装了程序包之后,Visual Studio会自动生成一个关于这些程序包版本的配置文件,删除或者保留它对程序不会造成什么影响.
- IIS MIME类型大全
文件如果下载不了,可能是iis中的MIME设置问题.格式前面为后辍名,后面为对应的MIME型(例如:rar application/x-rar-compressed 表示.RAR对应的是applica ...