1 var properties = new NameValueCollection(); 2 properties[StdSchedulerFactory.PropertySchedulerInstanceName] = instanceName; ; 4 properties[StdSchedulerFactory.PropertyJobStoreType] = typeof (MongoDbJobStore).AssemblyQualifiedName; properties[$] = ; properties[$] = ; scheduler = new StdSchedulerFactory(properties); 11 return scheduler.GetScheduler();
<1> PropertySchedulerInstanceName: 就是对Scheduler的Name进行的配置,大家可以根据情况定义一个简明释义的名字。
<2> PropertySchedulerInstanceId: 可以看到这个项采用的是machineName+NewGuid来保证Scheduler容器的SchedulerID唯一,唯一性特别重要,因为在
Cluster 中就是用它来保证唯一性的,不过上面的代码有点累赘,其实只要写上“AUTO”就可以了,由底层的
SimpleInstanceIdGenerator来保证uniqueID的生成,如StdSchedulerFactory.Instantiate方法源码所示:
1 if (schedInstId.Equals(AutoGenerateInstanceId)) 2 { 3 autoId = true; 4 instanceIdGeneratorType = LoadType(cfg.GetStringProperty(PropertySchedulerInstanceIdGeneratorType)) ?? typeof(SimpleInstanceIdGenerator); 5 } (schedInstId.Equals(SystemPropertyAsInstanceId)) 7 { 8 autoId = true; 9 instanceIdGeneratorType = typeof(SystemPropertyInstanceIdGenerator); 10 }
<3> PropertyJobStoreType:这个属性将MongoDbJobStore作为底层的IJobStore实现者。
<4> PropertyDataSourceConnectionString,collectionPrefix: 这两个没什么好说的,一个是mongodb的connectionstring,一个是collection的前缀。
好了,下面就是我的完整代码:
Main(string[] args) 2 { 3 4 LogManager.Adapter = new Common.Logging.Simple.TraceLoggerFactoryAdapter() 5 { 6 Level = LogLevel.All 7 }; properties = new NameValueCollection(); 10 properties[StdSchedulerFactory.PropertySchedulerInstanceId] = "AUTO"; 11 properties[StdSchedulerFactory.PropertyJobStoreType] = typeof(MongoDbJobStore).AssemblyQualifiedName; properties[$] = ; properties[$] = ; factory = new StdSchedulerFactory(properties); IScheduler scheduler = factory.GetScheduler(); 23 24 scheduler.Start(); job = JobBuilder.Create<HelloJob>().WithIdentity(, ).Build(); trigger = TriggerBuilder.Create().WithCronSchedule().Build(); (!scheduler.CheckExists(job.Key)) 31 { 32 scheduler.ScheduleJob(job, trigger); 33 } 34 35 Console.Read(); 36 }
这个我自定义的HelloJob中,我特意记录一下scheduler的调度时间schedulertime和Trigger应该触发的时间nextFireTime。