Quartz的糟糕设计

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值