diff --git a/README.md b/README.md index 04a8f3a1..10f0a9ed 100644 --- a/README.md +++ b/README.md @@ -7,19 +7,17 @@ git.osc地址:http://git.oschina.net/xuxueli0323/xxl-job 技术交流群(仅作技术交流):367260654 [![image](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=4686e3fe01118445c75673a66b4cc6b2c7ce0641528205b6f403c179062b0a52) -# 特点:集群任务调度管理 +# 特点: 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手; - 2、动态:支持动态修改任务状态,动态暂停/恢复任务,即时生效; - 3、服务HA:任务信息持久化到mysql中,Job服务天然支持集群,保证服务HA; - 4、任务HA:某台Job服务挂掉,任务会平滑分配给其他的某一台存活服务,即使所有服务挂掉,重启时或补偿执行丢失任务; - 5、一个任务只会在其中一台服务器上执行; - 6、任务串行执行; - 7、支持任务执行日志; - 8、支持自定义参数; - 9、支持任务失败次数超阈值邮件报警; - 10、支持在线查看,执行器详细日志; - 11、支持远程任务执行终止; - 12、支持登录验证; + 2、动态:支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,即时生效; + 3、调度HA:“调度中心”基于集群Quartz实现,可保证调度中心HA; + 4、任务HA:任务支持多地址配置,可保证任务HA(Failover); + 5、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性; + 6、自定义任务参数:支持在线配置调度任务入参,即时生效; + 7、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; + 8、执行日志:支持在线查看调度结果,并且查看完整的执行日志; + 9、邮件报警:任务失败时支持邮件报警,同时可自定义失败次数阀值; + 10、支持登录验证; # 新版本 V1.1.x,特性【于V1.1.x版本,XXL-JOB正式应用于我司,内部定制别名为 “Ferrari”,新接入应用推荐使用最新版本V1.3.x】 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手; @@ -66,6 +64,11 @@ git.osc地址:http://git.oschina.net/xuxueli0323/xxl-job /doc --------------------------------- 用户手册 2、在新的目录结构上,升级了用户手册; 3、优化了一些交互和UI; + +# 新版本1.3.2 + 1、调度逻辑进行事务包裹; + 2、执行器异步回调执行日志; + 3、【重要】在 “调度中心” 支持HA的基础上,扩展执行器的Failover支持,支持配置多执行期地址; # 源码目录说明 /xxl-job-admin 【调度中心】:负责管理调度信息,按照调度配置发出调度请求; diff --git a/doc/XXL-JOB1.3.x用户手册_20160523_2012.docx b/doc/XXL-JOB1.3.x用户手册_20160523_2012.docx deleted file mode 100644 index 4407fd64..00000000 Binary files a/doc/XXL-JOB1.3.x用户手册_20160523_2012.docx and /dev/null differ diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml index b2fabc1d..e840c5b8 100644 --- a/xxl-job-admin/pom.xml +++ b/xxl-job-admin/pom.xml @@ -148,7 +148,7 @@ com.xxl xxl-job-core - 1.3.1 + 1.3.2 diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java index a53ddeb7..76aec036 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java @@ -4,6 +4,7 @@ import java.text.MessageFormat; import java.util.Date; import java.util.HashMap; +import org.apache.commons.lang.StringUtils; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; @@ -89,18 +90,20 @@ public class RemoteHttpJobBean extends QuartzJobBean { if (handler_address.split(",").length > 1) { String failoverMessage = ""; for (String address : handler_address.split(",")) { - HashMap params = new HashMap(); - params.put(HandlerParamEnum.TIMESTAMP.name(), String.valueOf(System.currentTimeMillis())); - params.put(HandlerParamEnum.ACTION.name(), ActionEnum.BEAT.name()); - RemoteCallBack beatResult = HttpUtil.post(HttpUtil.addressToUrl(address), params); - failoverMessage += MessageFormat.format("BEAT running,
>>>[address] : {0},
>>>[status] : {1},
>>>[msg] : {2}

", address, beatResult.getStatus(), beatResult.getMsg()); - if (RemoteCallBack.SUCCESS.equals(beatResult.getStatus())) { - jobLog.setExecutorAddress(address); - RemoteCallBack triggerCallback = HttpUtil.post(HttpUtil.addressToUrl(address), handler_params); - triggerCallback.setStatus(RemoteCallBack.SUCCESS); - failoverMessage += MessageFormat.format("Trigger running,
>>>[address] : {0},
>>>[status] : {1},
>>>[msg] : {2}

", address, triggerCallback.getStatus(), triggerCallback.getMsg()); - triggerCallback.setMsg(failoverMessage); - return triggerCallback; + if (StringUtils.isNotBlank(address)) { + HashMap params = new HashMap(); + params.put(HandlerParamEnum.TIMESTAMP.name(), String.valueOf(System.currentTimeMillis())); + params.put(HandlerParamEnum.ACTION.name(), ActionEnum.BEAT.name()); + RemoteCallBack beatResult = HttpUtil.post(HttpUtil.addressToUrl(address), params); + failoverMessage += MessageFormat.format("BEAT running,
>>>[address] : {0},
>>>[status] : {1},
>>>[msg] : {2}

", address, beatResult.getStatus(), beatResult.getMsg()); + if (RemoteCallBack.SUCCESS.equals(beatResult.getStatus())) { + jobLog.setExecutorAddress(address); + RemoteCallBack triggerCallback = HttpUtil.post(HttpUtil.addressToUrl(address), handler_params); + triggerCallback.setStatus(RemoteCallBack.SUCCESS); + failoverMessage += MessageFormat.format("Trigger running,
>>>[address] : {0},
>>>[status] : {1},
>>>[msg] : {2}

", address, triggerCallback.getStatus(), triggerCallback.getMsg()); + triggerCallback.setMsg(failoverMessage); + return triggerCallback; + } } } diff --git a/xxl-job-core/pom.xml b/xxl-job-core/pom.xml index 6b20e945..827a95e4 100644 --- a/xxl-job-core/pom.xml +++ b/xxl-job-core/pom.xml @@ -7,7 +7,7 @@ 1.3.0-SNAPSHOT xxl-job-core - 1.3.1 + 1.3.2 diff --git a/xxl-job-executor-example/pom.xml b/xxl-job-executor-example/pom.xml index b65fac6b..32ae917f 100644 --- a/xxl-job-executor-example/pom.xml +++ b/xxl-job-executor-example/pom.xml @@ -79,7 +79,7 @@ com.xxl xxl-job-core - 1.3.1 + 1.3.2