1,为了更好的学习作业调度框架,先说Quartz.NET的几个必要对象
1.IJob(作业)
2.Scheduler(调度器)
3.Trigger (触发器)
要执行Job必须实现"IJob"接口或者"IStatefulJob"接口,这两个接口都有一个方法:
public void Execute(JobExecutionContext context)
这个方法就是要job要执行的方法,IJob是无状态Job ,"IStatefulJob" 是有状态Job,具体有什么不同在后面会有介绍
Scheduler:是将触发器和Job进行关联的一个类,启用Job 就要用到该类的start()方法,停止 shutdow()方法,暂停Standby()方法
Trigger :控制Job的执行周期 以及执行次数等。
先创建意个作业类 HelloJob实现 IJob接口
/// <summary>
/// 作业类
/// </summary>
public class HelloJob :IJob
{
/// <summary>
/// 作业
/// </summary>
/// <param name="context"></param>
public void Execute(JobExecutionContext context)
{
ILog log = LogManager.GetLogger(typeof(HelloJob));
log.Info("My frist Job");
Console.WriteLine("Hello Job");
}
}
在创建一个类负责调用Job
public class SimpleExample
{
public void RunJob()
{
ILog log = LogManager.GetLogger(typeof(HelloJob));
log.Info("调度工厂创建调度器初始化.....");
//实例化调度器工厂
StdSchedulerFactory scheduler = new StdSchedulerFactory();
//通过调度器工厂返回一个调度器实例
IScheduler sd = scheduler.GetScheduler();
log.Info("创建调度器成功");
log.Info("初始化Job...");
//frist_job:Job的名称,frist:Job的组名,typeof(HelloJob) 作业类
JobDetail job = new JobDetail("frist_job","frist", typeof(HelloJob));
//TriggerUtils 工具类,提供简便的方法配置Trigger
//TriggerUtils 的方法 makeSecondlyTrigger() 来创建一个每5秒种激发一次
Trigger trigger = TriggerUtils.MakeSecondlyTrigger(5);
//Trigger的逻辑名称,不能没有逻辑名称
trigger.Name = "tr";
// 向Scheduler注册job
sd.ScheduleJob(job, trigger);
log.Info("job运行......");
sd.Start();
}
}
StdSchedulerFactory scheduler = new StdSchedulerFactory();
实例化调度器工厂类,由工厂产生调度器。
StdSchedulerFactory 这个工厂类,必须依赖于app.config正确配置 才能正确执行,当然不配置的话还有另一个工厂类
DirectSchedulerFactory scheduler = DirectSchedulerFactory.Instance;
scheduler.CreateVolatileScheduler(10);
这个工厂类,完全是由手动创建的,
DirectSchedulerFactory.Instance 初始化
scheduler.CreateVolatileScheduler(10); //多少个工作者线程被创建用来处理 Job
看下面的app.config也信息的配置,它是为StdSchedulerFactory 服务的
<add key="quartz.threadPool.threadCount" value="10" />
IScheduler sd = scheduler.GetScheduler();
调度器不能直接自己实例化自己,只能通过StdSchedulerFactory 调度器工厂返回一个IScheduler 。
JobDetail job = new JobDetail("frist_job","frist", typeof(HelloJob));
JobDetail类相当于Job的一个详细信息类,Job是JobDetail 的一部分,Job的所有信息 都由JobDetail 携带
Trigger trigger = TriggerUtils.MakeSecondlyTrigger(5);
这个触发器,是由quartz提供的TriggerUtils工具类来实例化的,TriggerUtils这个工具类提供很多种控制时间的方法,比如说,控制每天下午6点 触发一次。
sd.ScheduleJob(job, trigger);
将作业和触发器注册的到调度器中,由调度器的sd.Start();来启动
ILog log = LogManager.GetLogger(typeof(HelloJob));
这个一个输出DUG信息,是quartz中的Common.Logging 这个Dll中的,要在app.config正确配置才能正常输出。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
</configSections>
<!--配置log信息-->
<common>
<logging>
<factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
<arg key="showLogName" value="false" />
<arg key="showDataTime" value="false" />
<arg key="level" value="Debug" />
<arg key="dateTimeFormat" value="HH:mm:ss:fff" />
</factoryAdapter>
</logging>
</common>
<!--分别设置调度器的实例名(instanceName) 和实例 ID (instanceId)
threadCount 属性控制了多少个工作者线程被创建用来处理 Job
threadPriority 属性设置工作者线程的优先级。
-->
<quartz>
<add key="quartz.scheduler.instanceName" value="Jack_Example" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="2" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />
<add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
</quartz>
<!--配置数据连接-->
<connectionStrings>
<add name="SqlConnectionStrings" connectionString="User=sa;Password=123456;Database=test; Server=."/>
</connectionStrings>
</configuration>
执行
class Program
{
static void Main(string[] args)
{
SimpleExample1 simple = new SimpleExample1();
simple.RunJob();
}
}