spring中的quartz調度問題

1、SchedulerFactoryBean會自動啓動。
當在spring文件中定義了多個SchedulerFactoryBean實例時,必定要當心,由於這些ScheduleFactoryBean自從load進程序裏,就會自動啓動。若是要手動控制,注意要將autoStartup屬性設置爲false
 
2、SchedulerFactoryBean暴露的是Scheduler,而不是SchedulerFactoryBean。
SchedulerFactoryBean實現了FactoryBean接口,必須實現兩個方法,一個是getObjectType,另一個則是getObject;其中getObjectType定義了返回的類型應該爲Scheduler,而getObject指定了返回的是其一個重要屬性scheduler,這個scheduler就是咱們要得到的調度。
 
若在配置文件裏爲SchedulerFactoryBean定義了id屬性爲"scheduler",則在程序裏調用getBean時,須要注意getBean("scheduler")返回的是Scheduler對象
 
3
SchedulerFactoryBean中有兩個很重要的屬性,一個是scheduler,另一個是schedulerFactoryClass,spring經過用schedulerFactoryClass作代理來產生調度,並把它賦給scheduler
 
private Class schedulerFactoryClass = StdSchedulerFactory.class;
//若是你沒有指定schedulerFactoryClass ,那麼它用的是quartz中自帶的調度工廠,
this.scheduler = createScheduler(schedulerFactory, this.schedulerName);
//這裏的schedulerName默認傳進來是空的,其實若是你不是用本身定義的schedulerFactoryClass
//恐怕也沒有什麼意義,由於createScheduler是這樣調用的
return schedulerFactory.getScheduler();
//顯然schedulerName並無用到,除非是你自行寫一個schedulerFactory,並作好相應處理,
//不然返回的這個scheduler必定是一個指定名稱的調度
Scheduler sched = schedRep.lookup(getSchedulerName());
//這個sched就是要代理生成的scheduler,getSchedulerName只有一句話,以下:
cfg.getStringProperty(PROP_SCHED_INSTANCE_NAME,"QuartzScheduler");
//若是咱們沒有使用一些特殊的機制,那麼返回的只能是一個固定的字符串。
 
如上說述,若是咱們但願不進行改造,就在spring的配置文件中定義多個調度的方法來實現咱們個性化的任務安排時,可能並不可行。由於spring配置的scheduler只能有一個,即便你定義了多個調度,那麼其實實現的只有一個,只是全部你但願指向不一樣調度的id都會指向它罷了,而這個調度會包含了其它全部調度中的任務。
 
 
4、抱錯:org.quartz.SchedulerException: Repeat Interval cannot be zero
場景:該錯誤一般是在引用了SimpleTriggerBean的時候沒有爲repeatCount和repeatInterval賦值發生的,很奇怪,SimpleTriggerBean有一個空構造函數,在裏面直接爲repeatCount賦了一個REPEAT_INDEFINITELY,這樣,當其進入validate函數時,會抱錯。而quartz中的SimpleTrigger這兩個屬性默認值均爲0,不懂spring中爲什麼這樣處理。
 
5quartzcrontab的區別
aquartz屬於用戶級別,crontab則屬於系統級別;
bquartz調度的線程,全部線程共享一個jvmcrontab調度的則是應用,每一個應用都獨立的佔用資源。
 
6quartz中加入併發多線程分析
aquartz自己是有線程池支持的,這個能夠用org.quartz.threadPool.threadCount屬性來設置線程池大小,quartz的任務能夠由quartz的線程池自動調度
b、對每一個任務也可能起多線程,可是須要對併發數量作控制,能夠考慮使用commons-pools提供的對象池機制
相關文章
相關標籤/搜索