Quartz的糟糕设计
不得不说Quartz定时任务系统提供给我们更方便,更好的处理定时任务的选择,但是现在以Spring为天下的应用环境来说Quartz的接口设计有点糟糕。
下面是Quartz的官方文档实例代码:
// define the job and tie it to our MyJob class
JobDetail job = newJob(MyJob.class)
.withIdentity("job1", "group1")
.build();
// Trigger the job to run now, and then repeat every 40 seconds
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);
大家注意一下newJob(MyJob.class)这一行,是不是突然觉得有点看不太懂,没关系,只不过是Quartz使用反射时对外提供的接口而已。不过说到反射,那么问题来了,反射生成的对象是不受Spring管理的,那么如果我们在自己的MyJob.class中需要依赖Spring容器内的其他对象的话,是不是要手动初始化呢?是的。这不得不说是一个糟糕的设计,况且我们并不想使用反射,暂且不考虑反射得效率如何,一般情况下我们是希望我们的MyJob.class像一个Service类或者Dao类一样,他线程安全,受spring管理,所以不必每次触发定时任务都给我new一个新的出来。
迄今为止我仍想不出为什么Quartz团队会犯这么低级的错误?但唯一一个可以说的过去得想法是他们想保证Quartz的线程安全,他们不认为我们能保证MyJob.class的线程安全性。但这样似乎也说不通,这样的思想就和最初JDK的设计者将List集合设计成Vector有什么区别。所以强烈建议Quartz团队能够重新设计一个不使用反射的接口,让我们来保证线程的安全性。
以上内容仅为个人拙见,欢迎提出其他见解。