目前的两个项目中,用到大部分的任务调度,有一些思考简单写下来.
一. 如果当前的任务调度很简单,例如:管理任务延迟执行("如1000ms后执行任务")以及周期性执行("如每500ms执行一次该任务"),那么可以选择Timer 和 scheduledExecutor, 因为scheduledExecutor在JDK1.5才有的,所以如果JDK太老,那只能使用Timer了,但至从JDK1.5之后,建议采用ScheduledExecutorService。,因为Timer是单线程执行任务,即不管有多少个任务在排队,只有一个任务能执行,在任务执行时有很多不确定性,
scheduledExecutor:详细介绍可见:http://ketqi.blog.51cto.com/blog/1130608/687681
二.如果调度比较复杂,则选择quartz,
三.如果希望任务即时调度,即生产一个任务马上就做一个任务,那一般使用消息队列.
前面的任务调度策略,都是估算任务执行时间,例如,源数据从一个DB转存到另外一个DB,一般情况根据数据量估算一个大致的时间,例如,每周六晚上12点进行转存即可,不需要有一条数据就调用转存job去执行,这样的任务调度可以选择Timer\quartz\SchedulerExecutor进行非实时调度.
但是,有的任务调度是需要实时的,例如我现在的项目有以下几个任务,
- 元搜索:在网站上搜索一些有效信息的URL
- 采集:根据搜索到的URL进行采集,并提取采集到作品的特征值
- 比对:对作品的特征值进行比对
- 取证:比对需要维权的项目进行取证
调度这四个任务时,希望,有一条数据就马上执行,这时就应该用MQ,我们在项目中使用的是apache的ActiveMQ,这样当有一个取证任务时,会被马上执行.未完待续,介绍activeMQ(存储要执行的任务)+Executor(任务消费者)配合使用