有时候我们在项目中会需要添加一些定时器来定时执行某项操作,
一、采用 定时器 Timer。这种方法适合循环执行的方法,每隔一段时间执行一次
实际上这就是新开一个线程,在Global文件 中新写一个方法来声明这个定时器,然后在 Application_Start 中调用此方法。
Application_Start方法就是当程序被访问的时候会被调用,所以想要执行这些方法我们要确保程序没有被IIS关闭。
System.Timers.Timer timer = new System.Timers.Timer(1200000);//执行时间间隔(毫秒)
timer.AutoReset = true;(是否重复执行 Elapsed 事件)
timer.Enabled = true;(是否引发 Elapsed 事件 )
timer.Elapsed += new System.Timers.ElapsedEventHandler(删除预约中信息);要执行的方法
二、在程序里面新开一个Job,这种方法适合定点执行,在config文件设置好执行的时间
想要采用这种方法 先要在nuget管理器安装一个 Quartz 的 dll
创建一个 JobServer的类,创建一个作业
public class JobServer<T> where T : IJob
{
public string JobName { get; set; }
public string JobGroup { get; set; }
public IJobDetail CrateJob()
{
IJobDetail job1 = JobBuilder.Create<T>() //创建一个作业
.WithIdentity(JobName, JobGroup) //JobName 代表你要执行的这个任务的名称。 JobGroup任务分组
.Build();
return job1;
}
}
然后添加一个 JobBase 的类,做一些关于这个作业的配置
public class JobBase
{
public static IScheduler Scheduler
{
get
{
///CrystalQuartzPanel.axd
var properties = new NameValueCollection();
// 设置线程池
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
//设置线程池的最大线程数量
properties["quartz.threadPool.threadCount"] = "5";
//设置作业中每个线程的优先级
properties["quartz.threadPool.threadPriority"] = ThreadPriority.Normal.ToString();
// 远程输出配置
properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
properties["quartz.scheduler.exporter.port"] = "1998"; //配置端口号
properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
properties["quartz.scheduler.exporter.channelType"] = "tcp"; //协议类型
//创建一个工厂
var schedulerFactory = new StdSchedulerFactory(properties);
//启动
var scheduler = schedulerFactory.GetScheduler();
return scheduler;
}
}
public static void AddSchedule<T>(JobServer<T> jobServer, ITrigger trigger, string jobName, string jobGroup) where T : IJob
{
jobServer.JobName = jobName;
jobServer.JobGroup = jobGroup;
Scheduler.ScheduleJob(jobServer.CrateJob(), trigger);
}
}
添加一个 JobManager 类,来开启调度
public static void State()
{
////开启调度
JobBase.Scheduler.Start();
////自动清算
JobBase.AddSchedule(new JobServer<AutomaticRenewalJob>(),
new AutomaticRenewalTriggerServer().AutomaticRenewalTrigger(), "锁定期合同(优享期30天)自动解锁与自动续期", "消息工作");
}
//其中 AutomaticRenewalJob是实际执行的一些方法,AutomaticRenewalTriggerServer是作业触发的一些配置
添加实际执行的方法和作业触发的一些配置
//作业实际执行的方法集
public class AutomaticRenewalJob : IJob
{
public void Execute(IJobExecutionContext context)
{
#region 日志
var reportDirectory = string.Format("~/autologs/{0}/", DateTime.Now.ToString("yyyy-MM-dd"));
reportDirectory = System.Web.Hosting.HostingEnvironment.MapPath(reportDirectory);
if (!Directory.Exists(reportDirectory))
{
Directory.CreateDirectory(reportDirectory);
}
var dailyReportFullPath = string.Format("{0}text_{1}.log", reportDirectory, DateTime.Now.Day);
#endregion
#region 任务调度加入日志
var logContent = string.Format("{0}-{1}{2}", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "自动解锁与续期任务已执行", Environment.NewLine);
File.AppendAllText(dailyReportFullPath, logContent);
#endregion
}
//作业启动的一些配置
public class AutomaticRenewalTriggerServer
{
public ITrigger AutomaticRenewalTrigger()
{
var runtime = ConfigurationManager.AppSettings["UnlockRumTime"];
var trigger = TriggerBuilder.Create()
.WithIdentity("自动解锁与续期", "作业触发器")
.StartNow()
.WithCronSchedule(runtime) //0点运行
.Build();
return trigger;
}
}
//0 0 12 * * ? 每天12点触发
//0 15 10 ? **每天10点15分触发
//0 15 10 * * ? 每天10点15分触发
//0 15 10 * * ? *每天10点15分触发
//0 15 10 * * ? 2005 2005年每天10点15分触发
//0 * 14 * * ? 每天下午的 2点到2点59分每分触发
//0 0 / 5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
//0 0 / 5 14,18 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
//每天下午的 18点到18点59分(整点开始,每隔5分触发)
//0 0 - 5 14 * * ? 每天下午的 2点到2点05分每分触发
//0 10,44 14 ? 3 WED 3月分每周三下午的 2点10分和2点44分触发 (特殊情况,在一个时间设置里,执行两次或 两次以上的情况)
//0 59 2 ? *FRI 每周5凌晨2点59分触发;
//0 15 10 ? *MON - FRI 从周一到周五每天上午的10点15分触发
//0 15 10 15 * ? 每月15号上午10点15分触发
//0 15 10 L * ? 每月最后一天的10点15分触发
//0 15 10 ? *6L 每月最后一周的星期五的10点15分触发
//0 15 10 ? *6L 2002 - 2005 从2002年到2005年每月最后一周的星期五的10点15分触发
//0 15 10 ? *6#3 每月的第三周的星期五开始触发
//0 0 12 1 / 5 * ? 每月的第一个中午开始每隔5天触发一次
//0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)
然后在 Gloabl文件的 Application_Start 方法启动这个方法
另外需要在config做一些配置工作
//首先在 appSettings
<!--任务调度时间配置-->
<add key="UnlockRumTime" value="0 47 17 * * ?" />
// configSections里面
<sectionGroup name="crystalQuartz" type="CrystalQuartz.Web.Configuration.CrystalQuartzConfigurationGroup">
<section name="provider" type="CrystalQuartz.Web.Configuration.ProviderSectionHandler" requirePermission="false" allowDefinition="Everywhere" />
</sectionGroup>
//
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<add name="CrystalQuartzPanel" verb="*" path="CrystalQuartzPanel.axd" type="CrystalQuartz.Web.PagesHandler, CrystalQuartz.Web" />
</handlers>
</system.webServer>
//runtime 里面
<dependentAssembly>
<assemblyIdentity name="Quartz" publicKeyToken="f6b8c98a402cc8a4" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.6.2.0" newVersion="2.6.2.0" />
</dependentAssembly>
//configuration 里面
<crystalQuartz>
<provider>
<add property="Type" value="CrystalQuartz.Core.SchedulerProviders.RemoteSchedulerProvider, CrystalQuartz.Core" />
<!-- Edit scheduler host value below =================================== -->
<add property="SchedulerHost" value="tcp://localhost:555/QuartzScheduler" />
<!-- =================================== -->
</provider>
</crystalQuartz>
这样设置的是每天17点47分执行