Quartz的糟糕设计

来源:互联网 发布:痔疮手术 知乎 编辑:程序博客网 时间:2024/06/04 07:17

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团队能够重新设计一个不使用反射的接口,让我们来保证线程的安全性。

以上内容仅为个人拙见,欢迎提出其他见解。

0 0
原创粉丝点击