#分布式定时任务
千呼万唤始出来,始出来啊,始出来!
##背景:
以前写了定时任务,但是线上进行部署的时候,会有一些任务,不能并行执行,或者需要绑定某台服务器进行执行等,怎么办了?
##解决方案:
自己完成一个可以干这些事的呗!
##现有系统提供功能:
1. 定时任务常规提供的功能任务增加、任务修改、任务删除
2. 任务搬迁、绑定、解绑
3. 多服务器简单自治
4. 非并行任务,提供任务争用
5. 多服务器令牌更新,如果出现服务器意外死亡,可以进行任务补刀,避免其争用到的任务也跟着挂了 ps:如果这台服务器绑定的任务,没有进行补刀
##系统特性:
1. 定时任务可以单class文件上传
2. 任务文件可以多服务器同步,也会有后台线程自动同步,但是速度要稍微慢点
3. 需要提供的服务,可以自行申明,使用spring的@Autowired即可 同样被调用的服务,需要有显示的名称申明,原理大家一看源代码就知道了
4. 如果增加的不止定时任务,还有附带的其他服务器类,那么需要重启
5. class文件被放到默认包路径下,下次启动,将会自动读取,如果要设置指定路径,请自行改写
##老规矩-框架技术
1. springMVC 4.3.3
2. 数据源 druid 1.0.25
3. 持久层 hibernate 4.3.8
4. redis 2.9.0
5. JDK 1.7
6. mysql-connector-java 5.1.34
##举个栗子
package com.quartz.job.task;
import com.quartz.common.ann.Scheduled;
/**
*
* Title:定时列子
* Description: 该栗子示例定时任务内容,注意上方的Scheduled注解,
* 这不是作者自己封装的,所以需要注意一下包路径
*
*
* @author tom
* @date:2016年11月8日 下午5:01:10
*/
public class SubTask3 {
@Scheduled(cron = "0/10 * * * * ?", taskName = "subtask3")
public void addTask() {
System.out.println("我是一个粉刷匠,粉刷本领强。。。");
}
}
##编译之后文件上传及任务执行
编译之后类文件
新增任务页面
上传结果
启动任务、同步到指定服务器
执行结果
##深入一下
package com.quartz.job.task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import com.quartz.common.ann.Scheduled;
import com.quartz.job.dao.impl.TaskServerExecDaoImpl;
/**
*
* Title:定时列子
* Description: 该栗子示例定时任务内容,注意上方的Scheduled注解,
* 这不是作者自己封装的,所以需要注意一下包路径
*
*
* @author tom
* @date:2016年11月8日 下午5:01:10
*/
public class SubTask3 {
@Autowired
@Qualifier("taskServerExecDao")
TaskServerExecDaoImpl taskServerExecDao;
@Scheduled(cron = "0/30 * * * * ?", taskName = "subtask3")
public void addTask() {
System.out.println("我是一个粉刷匠,粉刷本领强。。。");
System.out.println("任务列表如下:" + taskServerExecDao.findAll());
}
}
上传操作不在复述,直接上传执行结果
##多服务器去中心化令牌监听
多个服务器之间,采用轮询的方式,使用redis监听服务器令牌,当某个更新服务器出现问题挂掉,那么检测服务器将自动补刀,执行出问题服务器上的非并行任务,原理大致如下:
当应用1作为更新服务器,那么应用2作为检测服务器,检测应用1是否在规定时间内,更新该令牌,若未能及时更新,那么认为该服务器应该是出现了故障,需要由应用2进行补刀 ps:这里还可以进行优化,目前的检测方式不是太科学
##作者想说的话
这是小虎的第一个开源框架,请老司机指正,其中有太多的地方需要优化,希望有童鞋能够支出并且给出优化方案,谢谢
##作者的联系方式
QQ:489285337