Quartz一个开源的作业调度框架,OpenSymphony的开源项目。Quartz.Net 是Quartz的C#移植版本。
它一些很好的特性:
1:支持集群,作业分组,作业远程管理。
2:自定义精细的时间触发器,使用简单,作业和触发分离。
3:数据库支持,可以寄宿Windows服务,WebSite,winform等。
基础概念:
Scheduler 作业度器。
IJob 作业接口。 继承并实现Execute, 编写执行的具体作业逻辑。
JobBuilder 根据设置,生成一个详细作业信息(JobDetail)。
TriggerBuilder 根据规则,生产对应的Trigger
应用:
1创建mvc项目,并通过nuget获取Quartz的类库
2封装任务工厂
/// <summary>
/// 任务工厂
/// </summary>
/// <typeparam name="T">工作类</typeparam>
/// <param name="DetailName">工作名称</param>
/// <param name="TriggerName">触发器名称</param>
/// <param name="Minute">多长时间出发一次</param>
private static void JobsFactory<T>(string DetailName, string TriggerName, int Minute)
where T : IJob
{
//工厂1
ISchedulerFactory factory = new StdSchedulerFactory();
//启动
IScheduler scheduler = factory.GetScheduler();
scheduler.Start();
//描述工作
IJobDetail jobDetail = new JobDetailImpl(DetailName, null, typeof(T));
//触发器
ISimpleTrigger trigger = new SimpleTriggerImpl(TriggerName,
null,
DateTime.Now,
null,
SimpleTriggerImpl.RepeatIndefinitely,
TimeSpan.FromSeconds(Minute));
//执行
scheduler.ScheduleJob(jobDetail, trigger);
}
3创建工作内容并实现Ijob的接口
public class CancleOrderJob : IJob
{
B_Order_ConfrimCancelInfoManager manager = new B_Order_ConfrimCancelInfoManager();
public void Execute(IJobExecutionContext context)
{
log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
var list = manager.GetAllHandleOrder();
if (list != null)
{
foreach (var item in list)
{
if (item.GHandleTime < DateTime.Now)
{
try
{
manager.UpdateStatus(item.ID);
}
catch (Exception e)
{
logger.Error(e.Message);
throw;
}
}
}
}
}
}
在global中启动任务:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//自动取消订单
JobsFactory<CancleOrderJob>("CancleOrderDetial", "CancleOrderTrigger", 1000);
//自动完成订单
JobsFactory<CompleteOrderJob>("CompleteOrderDetial", "CompleteOrderTrigger", 1000);
//加载日志的配置文件
log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));
}
注意:这里用到了log4.net记录错误日志
log4.net记录错误日志的使用方法:
1应用log4.net的类库
2编写配置文件
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net debug="true">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="log//error_"/>
<param name="AppendToFile" value="true"/>
<param name="MaxSizeRollBackups" value="10"/>
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyy-MM-dd".log""/>
<param name="RollingStyle" value="Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d - %m%n"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
3在global中读取配置文件的信息
//加载日志的配置文件
log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));
4使用:
log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
logger.Error(e.Message);