Quartz.NET学习系列(八)--- 任务监听器

Quartz.NET提供了触发器监听接口、任务监听接口、计划监听接口,基本上不怎么使用,除了任务监听接口有使用场景外,其它的监听器目前还未找到使用场景。

任务监听接口需要继承自IJobListener,应用场景可以是:执行完一个任务,自动切换执行另一个任务。

具体代码如下:

        public class SimpleJob1 : IJob
	{
		private ILog log = LogManager.GetLogger(typeof(SimpleJob1));

		public virtual void Execute(IJobExecutionContext context)
		{
			JobKey jobKey = context.JobDetail.Key;
            log.InfoFormat("{0} 执行时间 {1}", jobKey, DateTime.Now.ToString());
		}
	}
        public class SimpleJob2 : IJob
	{
		private  ILog log = LogManager.GetLogger(typeof(SimpleJob2));

		public virtual void Execute(IJobExecutionContext context)
		{
			JobKey jobKey = context.JobDetail.Key;
			log.InfoFormat("{0} 执行时间 {1}", jobKey, System.DateTime.Now.ToString());
		}
	}
    public class Job1Listener : IJobListener
    {
        private  ILog log = LogManager.GetLogger(typeof (Job1Listener));

        public virtual string Name
        {
            get { return "job1_to_job2"; }
        }

        public virtual void JobToBeExecuted(IJobExecutionContext inContext)
        {
            log.Info("监听器准备执行完毕");
        }

        public virtual void JobExecutionVetoed(IJobExecutionContext inContext)
        {
            log.Info("监听器拒绝");
        }

        public virtual void JobWasExecuted(IJobExecutionContext inContext, JobExecutionException inException)
        {
            log.Info("监听器执行完毕");

            IJobDetail job2 = JobBuilder.Create<SimpleJob2>()
                .WithIdentity("job2")
                .Build();

            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("job2Trigger")
                .StartNow()
                .Build();

            try
            {
                inContext.Scheduler.ScheduleJob(job2, trigger);
            }
            catch (SchedulerException e)
            {
                log.Info("不能继续执行另一个任务job2");
                Console.Error.WriteLine(e.StackTrace);
            }
        }
    }
    public class ListenerExample
    {
        public static void Run()
        {
            ILog log = LogManager.GetLogger(typeof (ListenerExample));

            ISchedulerFactory sf = new StdSchedulerFactory();
            IScheduler sched = sf.GetScheduler();

            IJobDetail job = JobBuilder.Create<SimpleJob1>()
                .WithIdentity("job1")
                .Build();

            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1")
                .StartNow()
                .Build();

            IJobListener listener = new Job1Listener();
            IMatcher<JobKey> matcher = KeyMatcher<JobKey>.KeyEquals(job.Key);
            sched.ListenerManager.AddJobListener(listener, matcher);

            sched.ScheduleJob(job, trigger);
            sched.Start();

            log.Info("------- 开始计划 --------------");

            Thread.Sleep(TimeSpan.FromSeconds(30));

            sched.Shutdown(true);
            log.Info("------- 关闭计划 -----------------");

            SchedulerMetaData metaData = sched.GetMetaData();
            log.Info(string.Format("执行次数{0}", metaData.NumberOfJobsExecuted));
        }
    }

job1执行完毕会自动切换到job2。

时间: 2024-11-05 15:48:23

Quartz.NET学习系列(八)--- 任务监听器的相关文章

Quartz.NET学习系列

Quartz.NET是一个开源的任务调度引擎,对于周期性的任务,持续性的任务提供了很好的支持,并支持持久化,集群等功能.一下是我这个对于Quartz.NET的学习记录: 源码下载地址http://yunpan.cn/cZcHVh7W3SB3X  访问密码d45a 由于博客编辑器的问题,部分代码可能显示不完全,可点击 这个按钮来获取完整的源码 Quartz.NET学习系列(一)--- 快速入门 Quartz.NET学习系列(二)--- 简单触发器 Quartz.NET学习系列(三)--- Cron

Linux学习系列八:操作网口

一些相对高性能的单片机会带以太网接口,网口在MCU里算是比较复杂的外设了,因为它涉及到网络协议栈,通常情况下网络协议栈会运行在一个RTOS中,所以对普通单片机开发者来说网口使用起来相对难度较大一些.在Linux下网口是一个经常使用的接口,由于Linux具备成熟完备的网络通信协议栈,底层驱动厂家也都提供好了,所以使用起来相对方便的多.本篇对Linux下网口使用做个简单总结,希望对大家有所帮助. 内容主要包括使用buildroot来是实现ssh功能,UDP通信的例子,以及实际中容易犯的一个错误. 原

Quartz.NET学习系列(一)--- 快速入门

Quartz.NET是一个任务调度的开源框架,官网地址是http://www.quartz-scheduler.net/index.html 帮助文档地址是http://www.quartz-scheduler.net/documentation/index.html 目前Quartz.NET的最新版本是2.3.1,本系列以后的文章都是基于这个版本的.先从官网下载2.3.1版本的rar,可在rar目录Src/Quartz.Examples下找到官方提供的一系列的例子,包括触发器操作,任务中断,数

Quartz.NET学习系列(九)--- XML任务配置

Quartz.NET除了可以代码定义触发器.任务之外,还可以由XML定义这两个对象.其实Quartz.NET的理想架构是:计划管理容器作为服务器运行在服务机上,而触发器.任务的添加可通过自定义任务管理软件向服务器上添加特定的任务计划. 这时就要求数据的持久化以及服务器的容错性了,后面几篇文章将会介绍持久化以及集群相关内容. VS的XML只能提示 第一篇已经将Quartz.NET下载过来了,在路径doc/xml/文件加下可以找到job_scheduling_data_2_0.xsd vs的智能提示

Quartz.NET学习系列(十一)--- Quartz.NET持久化及客户端服务器模式

持久化         Quartz.NET如果不进行数据库相关配置,则默认的执行模式为内存模式,优点是执行速度快,确定就是数据无法存储,宕机了需要重新开始. 持久化只需要做如下配置(以SQLServer为例) NameValueCollection properties = new NameValueCollection(); //存储类型 properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobSt

Quartz.NET学习系列(十二)--- Quartz.NET集群

Quartz.NET提供了集群的配置,这个集群并不能达到负载均衡的效果,而仅仅提供了故障转移的功能,主要场景是:两个节点的Quartz.NET任务服务器同时连接到另一个节点的数据库服务器,当一个任务服务器宕机时,另一个任务服务器会启动. 集群的主要配置如下: properties["quartz.jobStore.clustered"] = "true"; 总的代码如下: [PersistJobDataAfterExecution] [DisallowConcurr

目标跟踪学习系列八:Struck:Structured Output Tracking with Kernels(2011 ICCV)

看来人机交互不是我想象的那么简单的,还是要花很多的功夫来打基础的.于是再来学习Tracking相关的一些文章算法. 在认真的学习了压缩跟踪(CT)以后,确实觉得自己对Tracking有了比较好的了解.但是看了在测试集上面的效果,被欺骗了原来CT的效果在真实的摄像头上面是很差劲的.唯一的优点就是快. 因此,还得回来学习一些其他的精度比较高的方法!这里选择了Struck.是大牛学长推荐的.同时本文使用了非线性的SVM算法,也想顺便的学习一下. 文章代码的位置:http://www.samhare.n

Angular学习系列八:调用服务方法

1:创建服务:ng g service services/request 2:使用rxjs就需要在service 中引用: import { Observable } from 'rxjs'; 3:在组件中引用服务: import { RequestService } from '../../services/request.service'; constructor(public req: RequestService) 4:学习目标:调用服务方法,使用回调方法获取服务方法,使用异步promi

Quartz.NET学习系列(三)--- Cron触发器

Cron触发器是使用Cron表达式来配置任务的时间的. Cron表达式介绍 Cron表达式总共有7个值,其中一个可选,具体如下(摘自官方文档): 值 是否必须 允许的值范围 允许的字符 Seconds YES 0-59 , - * / Minutes YES 0-59 , - * / Hours YES 0-23 , - * / Day of month YES 1-31 , - * ? / L W Month YES 1-12 or JAN-DEC , - * / Day of week YE