Quartz.Net插件
TriggerListener,JobListener
Cron表达式
Quartz.Net线程池
ISchedulerPlugin接口
public class MyPlugin : Quartz.Spi.ISchedulerPlugin { public void Initialize(string pluginName, IScheduler sched) { Console.WriteLine("实例化"); } public void Start() { Console.WriteLine("启动"); } public void Shutdown() { Console.WriteLine("关闭"); } }
主函数里面配置要实现的插件
static void Main(string[] args) { var properties = new NameValueCollection(); //MyPlugin 自定义名称。 "命名空间.类名,程序名称" properties["quartz.plugin.MyPlugin.type"] = "AyQzDemo.MyPlugin,AyQzDemo"; var schedulerFactory = new StdSchedulerFactory(properties); var scheduler = schedulerFactory.GetScheduler(); var job = JobBuilder.Create<HelloJob>() .WithIdentity("myJob", "group1") .Build(); var trigger = TriggerBuilder.Create() .WithIdentity("mytrigger", "group1") .WithCronSchedule("/2 * * ? * *") .Build(); scheduler.ScheduleJob(job, trigger); scheduler.Start(); System.Threading.Thread.Sleep(6000); scheduler.Shutdown(true); Console.ReadLine();
TriggerListener,JobListener
百度一搜几乎都是 java的用法,自己摸索如下
查看 quartz的一个源码
有个triggerlistener.name要设置
代码如下:
namespace AyQzDemo { public class HelloJob : IJob { int index = 1; public void Execute(IJobExecutionContext context) { Console.WriteLine("AY: Hello "+ (index++)); } } public class MyPlugin : Quartz.Spi.ISchedulerPlugin { public void Initialize(string pluginName, IScheduler sched) { Console.WriteLine("实例化"); } public void Start() { Console.WriteLine("启动"); } public void Shutdown() { Console.WriteLine("关闭"); } } public class MyTriggerListener : ITriggerListener { private string name= "MyTriggerListener"; //2017-11-10 14:56:42 ay设置 public void TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode) { Console.WriteLine("job完成时调用"); } public void TriggerFired(ITrigger trigger, IJobExecutionContext context) { Console.WriteLine("job执行时调用"); } public void TriggerMisfired(ITrigger trigger) { Console.WriteLine("错过触发时调用(例:线程不够用的情况下)"); } public bool VetoJobExecution(ITrigger trigger, IJobExecutionContext context) { //Trigger触发后,job执行时调用本方法。true即否决,job后面不执行。 return false; } public string Name { get { return name; } set { name = value; } } } class Program { static void Main(string[] args) { var properties = new NameValueCollection(); //MyPlugin 自定义名称。 "命名空间.类名,程序名称" properties["quartz.plugin.MyPlugin.type"] = "AyQzDemo.MyPlugin,AyQzDemo"; var schedulerFactory = new StdSchedulerFactory(properties); var scheduler = schedulerFactory.GetScheduler(); var job = JobBuilder.Create<HelloJob>() .WithIdentity("myJob", "group1") .Build(); var trigger = TriggerBuilder.Create() .WithIdentity("mytrigger", "group1") .WithCronSchedule("/2 * * ? * *") .Build(); MyTriggerListener myJobListener = new MyTriggerListener(); scheduler.ListenerManager.AddTriggerListener(myJobListener, Quartz.Impl.Matchers.KeyMatcher<TriggerKey>.KeyEquals(new TriggerKey("mytrigger", "group1"))); scheduler.ScheduleJob(job, trigger); scheduler.Start(); System.Threading.Thread.Sleep(6000); scheduler.Shutdown(true); Console.ReadLine(); } }
有点像拦截器,执行前和执行后,
////添加监听器到指定分类的所有监听器。
//scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.GroupEquals("myJobGroup"));
////添加监听器到指定的2个分组。
//scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.GroupEquals("myJobGroup"), GroupMatcher<TriggerKey>.GroupEquals("myJobGroup2"));
////添加监听器到所有的触发器上。
//scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.AnyGroup());
字段名允许的值允许的特殊字符
Seconds0-59, - * /
Minutes0-59, - * /
Hours0-23, - * /
Day of month 1-31, - * ? / L W
Month1-12 or JAN-DEC , - * /
Day of week 1-7 or SUN-SAT, - * ? / L #
Year空, 1970-2099, - * /
特殊字符解释
,或的意思。例:分钟位 5,10 即第5分钟或10分都触发。
/a/b。 a:代表起始时间,b频率时间。 例; 分钟位 3/5, 从第三分钟开始,每5分钟执行一次。
*频率。 即每一次波动。 例;分钟位 * 即表示每分钟
-区间。 例: 分钟位 5-10 即5到10分期间。
?任意值 。 即每一次波动。只能用在DayofMonth和DayofWeek,二者冲突。指定一个另一个一个要用?
L表示最后。 只能用在DayofMonth和DayofWeek,4L即最后一个星期三
W工作日。 表示最后。 只能用在DayofWeek
#4#2。 只能用DayofMonth。 某月的第二个星期三
实例介绍
”0 0 10,14,16 * * ?" 每天10点,14点,16点 触发。
"0 0/5 14,18 * * ?" 每天14点或18点中,每5分钟触发 。
"0 4/15 14-18 * * ?" 每天14点到18点期间, 从第四分钟触发,每15分钟一次。
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发。
properties["quartz.threadPool.threadCount"] = "5";
这个线程池的设置,是指同时间,调度器能执行Job的最大数量。
quartz是用每个线程跑一个job。上面的设置可以解释是job并发时能执行5个job,剩下的job如果触发时间恰好到了,当前job会进入暂停状态,直到有可用的线程。
如果在指定的时间范围依旧没有可用线程,会触发misfired时间。
quartz 提供了IThreadPool接口,也可以用自定义线程池来实现。
配置如下:
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
一般来说作业调度很少并发触发大量job,如果有上百个JOB,可在服务器承受范围内适量增加线程数量
文章参考: http://www.cnblogs.com/mushroom/p/4104484.html#3759345
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
推荐您阅读更多有关于“”的文章
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。