Quartz.NET学习系列(十一)--- Quartz.NET持久化及客户端服务器模式
持久化
Quartz.NET如果不进行数据库相关配置,则默认的执行模式为内存模式,优点是执行速度快,确定就是数据无法存储,宕机了需要重新开始。
持久化只需要做如下配置(以SQLServer为例)
NameValueCollection properties = new NameValueCollection(); //存储类型 properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"; //表明前缀 properties["quartz.jobStore.tablePrefix"] = "QRTZ_"; //驱动类型 properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz"; //数据源名称 properties["quartz.jobStore.dataSource"] = "myDS"; //连接字符串 properties["quartz.dataSource.myDS.connectionString"] = @"Data Source=(local);Initial Catalog=quartz;User ID=sa;Password=123"; //sqlserver版本 properties["quartz.dataSource.myDS.provider"] = "SqlServer-20";
Quartz.NET支持TCP的通信,所以可以有这样的架构场景:用服务器承载持久化下来的所有任务并持续执行,想添加任务可通过客户端管理工具来向服务器数据库添加任务(当然是调用Quartz.NET框架里的方法),这样就可以产生了任务调度服务。
服务器代码例子:
public class RemoteServerExample { public static void Run() { ILog log = LogManager.GetLogger(typeof(RemoteServerExample)); NameValueCollection properties = new NameValueCollection(); <span style="font-family: Arial, Helvetica, sans-serif;">properties["quartz.scheduler.instanceName"] = "RemoteServer";</span> properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; properties["quartz.threadPool.threadCount"] = "5"; properties["quartz.threadPool.threadPriority"] = "Normal"; // 设置服务器 properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz"; properties["quartz.scheduler.exporter.port"] = "555"; properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler"; properties["quartz.scheduler.exporter.channelType"] = "tcp"; properties["quartz.scheduler.exporter.channelName"] = "httpQuartz"; // 拒绝远程 //properties["quartz.scheduler.exporter.rejectRemoteRequests"] = "true"; //存储类型 properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"; //表明前缀 properties["quartz.jobStore.tablePrefix"] = "QRTZ_"; //驱动类型 properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz"; //数据源名称 properties["quartz.jobStore.dataSource"] = "myDS"; //连接字符串 properties["quartz.dataSource.myDS.connectionString"] = @"Data Source=(local);Initial Catalog=quartz;User ID=sa;Password=123"; //sqlserver版本 properties["quartz.dataSource.myDS.provider"] = "SqlServer-20"; ISchedulerFactory sf = new StdSchedulerFactory(properties); IScheduler sched = sf.GetScheduler(); sched.Start(); log.Info("------- 服务器启动 -----------------"); Thread.Sleep(TimeSpan.FromMinutes(5)); //sched.Shutdown(true); log.Info("------- 服务器关闭 -----------------"); SchedulerMetaData metaData = sched.GetMetaData(); log.Info("执行次数 " + metaData.NumberOfJobsExecuted ); } }客户端代码例子
[PersistJobDataAfterExecution] [DisallowConcurrentExecution] public class SimpleJob : IJob { public const string Message = "msg"; private static readonly ILog log = LogManager.GetLogger(typeof (SimpleJob)); public virtual void Execute(IJobExecutionContext context) { JobKey jobKey = context.JobDetail.Key; string message = context.JobDetail.JobDataMap.GetString(Message); log.InfoFormat("{0} 执行时间 {1}", jobKey, DateTime.Now.ToString()); log.InfoFormat("msg: {0}", message); } }
public class RemoteClientExample { public static void Run() { ILog log = LogManager.GetLogger(typeof (RemoteClientExample)); NameValueCollection properties = new NameValueCollection(); properties["quartz.scheduler.instanceName"] = "RemoteClient"; // 设置线程池 properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; properties["quartz.threadPool.threadCount"] = "5"; properties["quartz.threadPool.threadPriority"] = "Normal"; // 设置远程连接 properties["quartz.scheduler.proxy"] = "true"; properties["quartz.scheduler.proxy.address"] = "tcp://127.0.0.1:555/QuartzScheduler"; ISchedulerFactory sf = new StdSchedulerFactory(properties); IScheduler sched = sf.GetScheduler(); IJobDetail job = JobBuilder.Create<SimpleJob>() .WithIdentity("remotelyAddedJob", "default") .Build(); JobDataMap map = job.JobDataMap; map.Put("msg", "信息"); ITrigger trigger = TriggerBuilder.Create() .WithIdentity("remotelyAddedTrigger", "default") .ForJob(job.Key) .WithCronSchedule("/5 * * ? * *") .Build(); sched.ScheduleJob(job, trigger); log.Info("向服务器添加计划任务"); } public string Name { get { return null; } } }服务器如果是单机运行的话,一旦宕机就可能会出现业务问题,所以Quartz.NET提供了集群配置,这将在下一篇学习。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。