xxl-job 任务管理
xxl-job(https://github.com/xuxueli/xxl-job) 系统的具体设计,可以参考官方文档,非常详细,这里只说一下大概的流程。
1. 应用端通过继承类或者注解的方式,来标示一个类或者一个方法是一个job。
2. 在应用启动的时候,会做3个事情:
1. 扫描上面第一步的类或者方法,放入内存。
2. 启动一个内嵌的基于netty的http服务端。
3. 将内嵌的服务端地址注册到调度中心。
3. 调度中心取获分布式锁(mysql 的for update,保证HA状态下的调度中心只有一个能执行),拿到锁之后扫描需要执行的job,计算下一次要执行的时间, 放入到一个ring,类似于一个时间轮,之后会有一个单独的线程从ring中拿到当前要执行的job进行触发执行,触发方式是通过一定的负载策略,调用上面第二步内嵌http服务器的地址。
4. 应用内的http服务端接收到请求,会放入到内存队列中,之后会有单独一个线程从队列中拿到要执行的job进行执行。
我的注解版xxl-job: https://github.com/zhaoyb/xxl-job