典型回答
@Scheduled是Spring中提供的一种定时任务注解,可以非常方便的帮我们实现一个延迟/定时任务。很多人都用过,XXL-JOB也是一个比较常见的定时任务的选型,那么他们之间有啥区别?
分布式VS单机
@Scheduled是基于JVM进程的,当我们在代码中创建了一个@Scheduled的任务的时候,到了要执行的时间,集群中的所有机器都会一起执行。这样就会导致任务的重复执行以及数据重复处理。
虽然我们也可以用分布式锁、选master等方式来通过代码解决,但是这无形中增加了很大的复杂性。
✅用@Scheduled执行定时任务,如何避免集群的并发问题
而XXL-JOB天生就是分布式任务,他在任务运行时,通过加锁的方式,确保集群中只有一台机器会运行任务(分片任务有特殊的策略)。
所以,@Scheduled和XXL-JOB的区别,就像synchronized和分布式锁的区别类似。一个是单机任务,一个是分布式任务。
任务持久化
XXL-JOB是有自己的数据库的,他的任务的调度数据都保存在自己的数据库中,不管你自己的应用的集群是不是挂了,都不影响xxl-job自己的任务调度的进程。
比如你的任务10分钟调度一次, 你在10:00刚刚调度之后,下一次应该在10:10调度,这时候,你的服务发生了重启,只要在10:10的时候服务启动好了就行了,就能正常调度。
而@Scheduled是完全基于JVM内存的,应用重启之后,历史的调度数据都没有了。
比如你的任务10分钟调度一次, 你在10:00刚刚调度之后,下一次应该在10:10调度,这时候,你的服务发生了重启,重启之后,没人知道下一次要在10:10调度这个事儿了。就需要重新触发@Scheduled的执行。(这里指的是固定频率的调度方式,cron这种方式还是可以的到时间就调度的)
故障转移能力
XXL-JOB作为一个分布式任务框架,他不依赖具体的某一个应用的实例,他依赖的整个集群,只要集群中有机器可以调度,他就能做调度,即使其中某台机器挂了,也不影响任务的执行,具备很好地故障转移的能力。
@Scheduled因为是个单机任务,就谈不上分布式、集群啥的了,也没啥故障转移能力,因为他所在的那个单机挂了,任务也就挂了。
可视化任务配置
用过XXL-JOB的都知道,他是有一个控制台的,可以在上面图形化界面配置任务,可以非常方便的查看任务配置、调度记录、甚至是报错信息都有的。非常方便管理和运维。
而@Scheduled是个纯内存调度,不存在任何可视化能力。
动态配置修改
@Scheduled是基于JVM内存运行的,在应用启动时,如果已经配置好了调度策略,比如用cron配置每2小时运行一次,如果你想把它改成3小时执行一次,就需要改代码,并且重启应用,非常不方便。
而XXL-JOB就简单很多,只需要在控制台上修改一下配置,保存下就像了, 你的应用不需要做重启。
分片任务
XXL-JOB还能充分利用到集群的能力,他提供了分片模式:支持将一个大任务拆分成多个小片段,广播给集群中的所有机器并行处理。例如,处理 100 万条数据,如果有 10 台机器,每台只需处理 10 万条,显著提升效率。
其他
因为XXL-JOB是个非常成熟的定时任务框架,他还有很多其他的功能,比如权限控制等等。