quartz mysql 分布式_QuartzCluster

#分布式定时任务

千呼万唤始出来,始出来啊,始出来!

##背景:

以前写了定时任务,但是线上进行部署的时候,会有一些任务,不能并行执行,或者需要绑定某台服务器进行执行等,怎么办了?

##解决方案:

自己完成一个可以干这些事的呗!

##现有系统提供功能:

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("我是一个粉刷匠,粉刷本领强。。。");

}

}

##编译之后文件上传及任务执行

编译之后类文件

7e9a923b2265cf4fbd182dca86790e27.png

新增任务页面

726a31a39189e9b59107eadd91dfa966.png

上传结果

8af855157d449c1f73a82f9b8dfc351d.png

启动任务、同步到指定服务器

af03dfc51736628d4f12e90e28d92b9b.png

执行结果

325dccccb6a57ae448d832eca374630c.png

##深入一下

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());

}

}

上传操作不在复述,直接上传执行结果

818ae50570b8c4400bf5eb7016997152.png

##多服务器去中心化令牌监听

多个服务器之间,采用轮询的方式,使用redis监听服务器令牌,当某个更新服务器出现问题挂掉,那么检测服务器将自动补刀,执行出问题服务器上的非并行任务,原理大致如下:

当应用1作为更新服务器,那么应用2作为检测服务器,检测应用1是否在规定时间内,更新该令牌,若未能及时更新,那么认为该服务器应该是出现了故障,需要由应用2进行补刀 ps:这里还可以进行优化,目前的检测方式不是太科学

64b28a9356717caa24eb1927195e050f.png

##作者想说的话

这是小虎的第一个开源框架,请老司机指正,其中有太多的地方需要优化,希望有童鞋能够支出并且给出优化方案,谢谢

##作者的联系方式

QQ:489285337

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值