单个定时任务的实现方式
1:thread 。 sleep 缺点不会释放锁 需要使用多线程,单线程去使用死循环
2:timetask
3:
4:quartz 任务调度 实现job接口 重写execute方法
quartz 表达式:
分布式实现任务不会重复执行(幂等性问题):
示例:tomcat1 和tomcat2 同时启动会同时启动两个任务
解决思路
在集群的情况下让job只能被一台服务器执行-》多个jvm通信,只能让一个jvm去执行。
解决方案
1: zk分布式锁。 临时节点,使用临时节点作为锁
缺点:不易与扩展,效率不高,编写代码复杂
2:使用配置文件作为开关。 0表示开关。--适合小项目
3:使用数据库表的唯一约束。插入一条主键一致的数据; --效率不高
以上缺点---没有容错机制,只能让一个jvm执行,不能解决高并发。
4:使用分布式任务调度平台
高可用,容错机制,支持集群,管理机制,负载均衡,自动管理,操作简单; 类似nginx
xxljob -- 实现思路
底层使用quartz 进行包装
1:创建执行器(客户端消费地址)
2:创建使用quartz表达式进行执行
3:任何一个job会现在调度器执行一遍,往执行器发一个请求