# task-schedule
**Repository Path**: cancode/task-schedule
## Basic Information
- **Project Name**: task-schedule
- **Description**: 基于zookeeper+quartz的分布式任务调度组件
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-01-12
- **Last Updated**: 2022-01-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# task-schedule
基于zookeeper+quartz的分布式任务调度组件,非常小巧,使用简单,只需要引入jar包,不需要单独部署服务端。确保所有任务在集群中均匀分布,不重复,不遗漏的执行。
支持动态添加和删除任务。
## 功能概述
1. 基于zookeeper+quartz的分布任务调度系统,适合多任务的系统使用,合理分配资源。
2. 确保每个任务在集群节点均匀分布,不重复不遗漏的执行。
3. 单个任务节点故障时自动转移到其他任务节点继续执行。
4. 任务节点启动时必须保证zookeeper可用,任务节点运行期zookeeper集群不可用时任务节点保持可用前状态运行,zookeeper集群恢复正常运期。
5. 添加ip黑名单,过滤不需要执行任务的节点。
6. 提供简单管理页面、任务管理的接口。
7. 任务持久化。
## 模块架构



## 管理页面

访问URL:项目名称/taskSchedule/index,如果servlet3.x以下,请手动配置web.xml文件
```
TaskSchedule
com.secsbrain.frame.task.web.HomeServlet
TaskSchedule
/taskSchedule/*
```
## 任务持久化脚本
```
-- ----------------------------
-- Table structure for `sys_task_schedule_job`
-- ----------------------------
DROP TABLE IF EXISTS `sys_task_schedule_job`;
CREATE TABLE `sys_task_schedule_job` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`job_name` varchar(255) DEFAULT NULL COMMENT '任务名称',
`job_status` varchar(1) DEFAULT NULL COMMENT '任务状态 0-停止,1-运行,2-删除',
`job_group` varchar(255) NOT NULL COMMENT '任务组',
`cron_expression` varchar(255) DEFAULT NULL COMMENT '表达式',
`bean_class` varchar(255) DEFAULT NULL COMMENT '类路径',
`spring_id` varchar(255) DEFAULT NULL COMMENT 'springId',
`method_name` varchar(255) DEFAULT NULL COMMENT '方法名',
`is_concurrent` varchar(1) DEFAULT NULL COMMENT '是否同步',
`description` varchar(500) DEFAULT NULL COMMENT '描述',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`prj_name` varchar(50) DEFAULT NULL COMMENT '工程名,与需要调度任务的工程名保持一致,如果部署在根目录则为空',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='任务调度配置表';
-- ----------------------------
-- Records of sys_task_schedule_job
-- ----------------------------
INSERT INTO `sys_task_schedule_job` VALUES ('12', 'job-test', '1', 'test', '0 0/10 * * * ?',
'com.secsbrain.live.mgr.job', '', 'gogogo', '1', '任务测试', '2017-01-10 17:05:06', '2017-01-12 17:07:34', 'live-mgr');
###如果应用的上下文没有子路径,就是直接通过ip:port访问。那么prj_name填BLANK,这样一来只支持一个应用了。
```
新建类,用于测试JOB:
```
package com.secsbrain.live.mgr.job;
/**
* 任务测试类
*
* @author zhaoyi
*/
public class JobTest {
public void gogogo(){
System.out.println("如果觉得快乐你就拍拍手");
}
}
```
zookeeper需3.4.8以上版本
## 传统spring配置
```
true
```
## springboot配置
```
@Configuration
public class TaskScheduleConfig {
@Value("${zookeeper.address}")
private String zookeeperUrl;
@Bean(name = "zkScheduleManager",initMethod="init")
public ZKScheduleManager zkScheduleManager(){
ZKScheduleManager zkScheduleManager=new ZKScheduleManager();
Map zkConfig=new HashMap<>();
zkConfig.put("zkConnectString", zookeeperUrl);
zkConfig.put("rootPath", "/task_brain/schedule");
zkConfig.put("zkSessionTimeout", "60000");
zkConfig.put("userName", "test");
zkConfig.put("password", "test");
zkScheduleManager.setZkConfig(zkConfig);
return zkScheduleManager;
}
@Bean(name = "schedulerFactoryBean")
public SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean schedulerFactoryBean=new SchedulerFactoryBean();
Properties quartzProperties=new Properties();
quartzProperties.put("org.quartz.scheduler.skipUpdateCheck", true);
schedulerFactoryBean.setQuartzProperties(quartzProperties);
return schedulerFactoryBean;
}
/**
* 代码注册servlet(不需要@ServletComponentScan注解)
* @return
*/
@Bean
public ServletRegistrationBean servletRegistrationBean() {
return new ServletRegistrationBean(new HomeServlet(), "/taskSchedule/*");
}
}
```
注:如果觉得日志过多,可以屏蔽日志。
logback: ``````
log4j:```log4j.logger.com.secsbrain.frame.task=info```
还要把logback的隐式依赖给去掉:
```
com.github.tianzi94wob
frame-task
1.0.0.RELEASES
ch.qos.logback
logback-classic
ch.qos.logback
logback-core
```
1.0.0.RELEASES版本,包需要换成com.secsbrain
此外,zookeeper的版本需要3.4.6以上
## API
1. 动态设置任务
```
ConsoleManager.setScheduleTask(TaskDefine taskDefine);
```
2. 动态删除任务
```
ConsoleManager.delScheduleTask(String targetBean, String targetMethod);
```
3. 查询任务列表
```
ConsoleManager.queryScheduleTask();
```
## 持久化任务管理
注入bean:TaskScheduleJobService
1. 查询持久化任务列表
```
List queryTaskScheduleJobList(TaskScheduleJob taskScheduleJob);
```
2. 添加持久化任务
```
void addTask(TaskDefine taskDefine) throws Exception;
```
3. 通过任务ID更新,工程名、表达式、任务描述
```
void updateTask(TaskScheduleJob taskScheduleJob) throws Exception;
```
4. 逻辑删除任务
```
void deleteTask(Long jobId) throws Exception;
```
5. 查看任务实际运行的详情
```
TaskBean selectTaskDetail(Long jobId) throws Exception;
```
6. 更改任务状态
```
void changeStatus(Long jobId, String cmd) throws Exception;
```
用户按需使用接口开发持久化任务管理界面
前端工程地址:https://github.com/tianzi94wob/task-schedule-npm
## 不足
目前从新增任务到调度有1~2秒的延迟,请在实际业务场景开发中注意规避这个问题。如果zk迁移,需要注意把老数据也迁移过去
我的第一次开源尝试。反反复复修改了好几个月。这个组件应用场景目前还比较单一,可能还会存在一些问题,希望大家一起来优化这个组件,为开源社区作贡献!
## 大家都在用
- [千里目直播](http://www.qlmzhibo.com/)
- [易笔账](http://money.innovatelife.net/)
## 关于
改进于uncode-schedule,作者:冶卫军(ywj_316@qq.com,微信:yeweijun)
作者:赵毅(531559024@qq.com)