diff --git a/README.md b/README.md index 563488a6..18df94d2 100644 --- a/README.md +++ b/README.md @@ -21,14 +21,15 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手; - 2、动态:支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,即时生效; - 3、调度HA:“调度中心”基于集群Quartz实现,可保证调度中心HA; -- 4、任务HA:任务支持多地址配置,可保证任务HA(Failover); -- 5、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性; -- 6、自定义任务参数:支持在线配置调度任务入参,即时生效; -- 7、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; -- 8、执行日志:支持在线查看调度结果,并且查看完整的执行日志; -- 9、邮件报警:任务失败时支持邮件报警,同时可自定义失败次数阀值; -- 10、支持登录验证; -- 11、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。 +- 4、任务HA:任务支持多地址配置,可保证任务执行HA; +- 5、任务Failover:多地址配置时,调度失败时将会平滑切换执行器进行Failover; +- 6、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性; +- 7、自定义任务参数:支持在线配置调度任务入参,即时生效; +- 8、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; +- 9、执行日志:支持在线查看调度结果,并且查看完整的执行日志; +- 10、邮件报警:任务失败时支持邮件报警,同时可自定义失败次数阀值; +- 11、支持登录验证; +- 12、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。 #### 1.3 发展 于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计…… 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 76aec036..5c6c0669 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 @@ -1,8 +1,11 @@ package com.xxl.job.admin.core.jobbean; import java.text.MessageFormat; +import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.List; import org.apache.commons.lang.StringUtils; import org.quartz.JobExecutionContext; @@ -88,6 +91,12 @@ public class RemoteHttpJobBean extends QuartzJobBean { */ public RemoteCallBack failoverTrigger(String handler_address, HashMap handler_params, XxlJobLog jobLog){ if (handler_address.split(",").length > 1) { + + // for ha + List addressList = Arrays.asList(handler_address.split(",")); + Collections.shuffle(addressList); + + // for failover String failoverMessage = ""; for (String address : handler_address.split(",")) { if (StringUtils.isNotBlank(address)) {