您的位置:首页 > 其它

Quartz.NET(作业调度框架) 学习笔记(二)【Hello Job】

2011-11-22 20:53 561 查看
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();

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: