diff --git a/README.md b/README.md index 6c96a726..3de35d2c 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,25 @@ git.osc地址:http://git.oschina.net/xuxueli0323/xxl-job 博客地址(内附使用教程):http://www.cnblogs.com/xuxueli/p/5021979.html -# 基于quartz封装实现的的集群任务调度管理平台 - 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手 - 2、动态:支持动态修改任务状态,动态暂停/恢复任务,即时生效. - 3、集群:任务信息持久化到mysql中,支持Job服务器集群(高可用),一个任务只会在其中一台服务器上执行 +# 特点:基于quartz封装实现的的集群任务调度管理平台 + 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手; + 2、动态:支持动态修改任务状态,动态暂停/恢复任务,即时生效; + 3、服务HA:任务信息持久化到mysql中,Job服务天然支持集群,保证服务HA; + 4、任务HA:某台Job服务挂掉,任务会平滑分配给其他的某一台存活服务,即使所有服务挂掉,重启时或补偿执行丢失任务; + 5、一个任务只会在其中一台服务器上执行; + 6、任务串行执行; + 7、支持任务执行日志; + 8、支持自定义参数; + +# 新版本 V1.2.x :架构模块化 【开发中...】 + 说明:V1.2版本将系统架构按功能拆分为: + 调度模块[xxl-job-admin]:负责管理调度信息,按照调度配置发出调度请求; + 任务模块[xxl-job-client-demo]:负责接收调度请求并执行任务逻辑;任务模块可以方便的嵌入web项目,可以参考此demo; + 通讯模块[xxl-job-client]:负责调度模块和任务模块之间的信息通讯; + 优点: + 解耦:任务模块提供任务接口,调度模块维护调度信息,业务相互独立; + 高扩展性; + 稳定性; + + Tips:如果您追求一个简单调度服务,这里也提供了一个简洁分支[xxl-job-simple],它针对旧版调度框架做了细微完善; + diff --git a/branch-dianping/README.md b/branch-dianping/README.md deleted file mode 100644 index 89fa00ed..00000000 --- a/branch-dianping/README.md +++ /dev/null @@ -1,11 +0,0 @@ -## dianping-job[任务调度平台] - - 分层: 调度和任务拆分, 支持动态扩充, 管理任务 - 1. 调度模块:dianping-job-web, 维护任务的调度信息,负责定时/周期性的发出调度请求. - 2. 任务模块:dianping-job-client, 具体的任务逻辑,负责接收调度模块的调度请求,执行任务逻辑. - 3. 通讯模块:dianping-job-client, 负责调度模块和任务模块之间的通讯. - - 说明: - 1. 调度模块集群部署[HA]. - 2. 任务串行执行. - 3. 记录调度日系. \ No newline at end of file diff --git a/branch-dianping/dianping-job-client-demo/src/main/resources/log4j.properties b/branch-dianping/dianping-job-client-demo/src/main/resources/log4j.properties deleted file mode 100644 index b02f63d0..00000000 --- a/branch-dianping/dianping-job-client-demo/src/main/resources/log4j.properties +++ /dev/null @@ -1,10 +0,0 @@ -log4j.rootLogger=info,console - -log4j.appender.console=org.apache.log4j.ConsoleAppender -log4j.appender.console.layout=org.apache.log4j.PatternLayout -log4j.appender.console.layout.ConversionPattern=%d - dianping-job-client-demo - %p [%c] - <%m>%n - -log4j.appender.logFile=org.apache.log4j.DailyRollingFileAppender -log4j.appender.logFile.File=${catalina.base}/logs/dianping-job-client-demo.log -log4j.appender.logFile.layout=org.apache.log4j.PatternLayout -log4j.appender.logFile.layout.ConversionPattern=%d - dianping-job-client-demo - %p [%c] - <%m>%n diff --git a/branch-dianping/dianping-job-web/src/main/resources/log4j.properties b/branch-dianping/dianping-job-web/src/main/resources/log4j.properties deleted file mode 100644 index 7ae3b799..00000000 --- a/branch-dianping/dianping-job-web/src/main/resources/log4j.properties +++ /dev/null @@ -1,10 +0,0 @@ -log4j.rootLogger=info,console,logFile - -log4j.appender.console=org.apache.log4j.ConsoleAppender -log4j.appender.console.layout=org.apache.log4j.PatternLayout -log4j.appender.console.layout.ConversionPattern=%d - dianping-job-web - %p [%c] - <%m>%n - -log4j.appender.logFile=org.apache.log4j.DailyRollingFileAppender -log4j.appender.logFile.File=${catalina.base}/logs/dianping-job-web.log -log4j.appender.logFile.layout=org.apache.log4j.PatternLayout -log4j.appender.logFile.layout.ConversionPattern=%d - dianping-job-web - %p [%c] - <%m>%n diff --git a/branch-dianping/dianping-job-web/src/main/webapp/WEB-INF/template/job/help.ftl b/branch-dianping/dianping-job-web/src/main/webapp/WEB-INF/template/job/help.ftl deleted file mode 100644 index ac18df2f..00000000 --- a/branch-dianping/dianping-job-web/src/main/webapp/WEB-INF/template/job/help.ftl +++ /dev/null @@ -1,76 +0,0 @@ - - - - 调度中心 - <#import "/common/common.macro.ftl" as netCommon> - <@netCommon.commonStyle /> - - -
- - <@netCommon.commonHeader /> - - <@netCommon.commonLeft /> - - -
- -
-

使用教程调度管理平台

- -
- - -
-
-

简介:DIANPING_CLOCK

-

基于quartz封装实现的的集群任务调度管理平台.

-

-
-
-

特点:

-

1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手.

-

2、动态:支持动态修改任务状态,动态暂停/恢复任务,即时生效.

-

3、集群:任务信息持久化到mysql中,支持Job服务器集群(高可用),一个任务只会在其中一台服务器上执行.

-
- -
-

分层模型:

-

1、基础:基于quartz封装底层调度层,通过CORN自定义任务执行周期,最终执行自定义JobBean的execute方法,如需多个任务,需要开发多个JobBean实现.

-

2、分层:上述基础调度模型存在一定局限,调度层和任务层耦合,当新任务上线势必影响任务的正常调度,因此规划将调度系统分层为:调度层 + 任务层 + 通讯层.

-

-

-
-

》调度模块:维护任务的调度信息,负责定时/周期性的发出调度请求.

-

》任务模块:具体的任务逻辑,负责接收调度模块的调度请求,执行任务逻辑.

-

》通讯模块:负责调度模块和任务模块之间的通讯.

-

(总而言之,一条完整任务由 “调度信息” 和 “任务信息” 组成.)

-
-
-

-
- -
-

调度属性解析 : 发出HTTP调度请求

-

1、调度Key【必填】:调度信息的全局唯一标识.

-

2、调度Corn【必填】:调度执行的时间表达式.

-

3、调度描述【必填】:调度的简述.

-

4、调度URL【必填】:调度执行时发出HTTP请求的目标URL地址.

-

5、+args【选填】:调度执行时发出HTTP请求的附带的POST参数.

-
-
- -
- - - - <@netCommon.commonFooter /> - - <@netCommon.commonControl /> -
-<@netCommon.commonScript /> - - diff --git a/branch-dianping/doc/db/tables_mysql.sql b/branch-dianping/doc/db/tables_mysql.sql deleted file mode 100644 index ba85d2c5..00000000 --- a/branch-dianping/doc/db/tables_mysql.sql +++ /dev/null @@ -1,168 +0,0 @@ -# -# Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar -# -# PLEASE consider using mysql with innodb tables to avoid locking issues -# -# In your Quartz properties file, you'll need to set -# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate -# - -DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; -DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; -DROP TABLE IF EXISTS QRTZ_LOCKS; -DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; -DROP TABLE IF EXISTS QRTZ_CALENDARS; - - -CREATE TABLE QRTZ_JOB_DETAILS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - JOB_NAME VARCHAR(200) NOT NULL, - JOB_GROUP VARCHAR(200) NOT NULL, - DESCRIPTION VARCHAR(250) NULL, - JOB_CLASS_NAME VARCHAR(250) NOT NULL, - IS_DURABLE VARCHAR(1) NOT NULL, - IS_NONCONCURRENT VARCHAR(1) NOT NULL, - IS_UPDATE_DATA VARCHAR(1) NOT NULL, - REQUESTS_RECOVERY VARCHAR(1) NOT NULL, - JOB_DATA BLOB NULL, - PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) -); - -CREATE TABLE QRTZ_TRIGGERS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - TRIGGER_NAME VARCHAR(200) NOT NULL, - TRIGGER_GROUP VARCHAR(200) NOT NULL, - JOB_NAME VARCHAR(200) NOT NULL, - JOB_GROUP VARCHAR(200) NOT NULL, - DESCRIPTION VARCHAR(250) NULL, - NEXT_FIRE_TIME BIGINT(13) NULL, - PREV_FIRE_TIME BIGINT(13) NULL, - PRIORITY INTEGER NULL, - TRIGGER_STATE VARCHAR(16) NOT NULL, - TRIGGER_TYPE VARCHAR(8) NOT NULL, - START_TIME BIGINT(13) NOT NULL, - END_TIME BIGINT(13) NULL, - CALENDAR_NAME VARCHAR(200) NULL, - MISFIRE_INSTR SMALLINT(2) NULL, - JOB_DATA BLOB NULL, - PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), - FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) - REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP) -); - -CREATE TABLE QRTZ_SIMPLE_TRIGGERS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - TRIGGER_NAME VARCHAR(200) NOT NULL, - TRIGGER_GROUP VARCHAR(200) NOT NULL, - REPEAT_COUNT BIGINT(7) NOT NULL, - REPEAT_INTERVAL BIGINT(12) NOT NULL, - TIMES_TRIGGERED BIGINT(10) NOT NULL, - PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), - FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) - REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) -); - -CREATE TABLE QRTZ_CRON_TRIGGERS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - TRIGGER_NAME VARCHAR(200) NOT NULL, - TRIGGER_GROUP VARCHAR(200) NOT NULL, - CRON_EXPRESSION VARCHAR(200) NOT NULL, - TIME_ZONE_ID VARCHAR(80), - PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), - FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) - REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) -); - -CREATE TABLE QRTZ_SIMPROP_TRIGGERS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - TRIGGER_NAME VARCHAR(200) NOT NULL, - TRIGGER_GROUP VARCHAR(200) NOT NULL, - STR_PROP_1 VARCHAR(512) NULL, - STR_PROP_2 VARCHAR(512) NULL, - STR_PROP_3 VARCHAR(512) NULL, - INT_PROP_1 INT NULL, - INT_PROP_2 INT NULL, - LONG_PROP_1 BIGINT NULL, - LONG_PROP_2 BIGINT NULL, - DEC_PROP_1 NUMERIC(13,4) NULL, - DEC_PROP_2 NUMERIC(13,4) NULL, - BOOL_PROP_1 VARCHAR(1) NULL, - BOOL_PROP_2 VARCHAR(1) NULL, - PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), - FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) - REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) -); - -CREATE TABLE QRTZ_BLOB_TRIGGERS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - TRIGGER_NAME VARCHAR(200) NOT NULL, - TRIGGER_GROUP VARCHAR(200) NOT NULL, - BLOB_DATA BLOB NULL, - PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), - FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) - REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) -); - -CREATE TABLE QRTZ_CALENDARS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - CALENDAR_NAME VARCHAR(200) NOT NULL, - CALENDAR BLOB NOT NULL, - PRIMARY KEY (SCHED_NAME,CALENDAR_NAME) -); - -CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - TRIGGER_GROUP VARCHAR(200) NOT NULL, - PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP) -); - -CREATE TABLE QRTZ_FIRED_TRIGGERS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - ENTRY_ID VARCHAR(95) NOT NULL, - TRIGGER_NAME VARCHAR(200) NOT NULL, - TRIGGER_GROUP VARCHAR(200) NOT NULL, - INSTANCE_NAME VARCHAR(200) NOT NULL, - FIRED_TIME BIGINT(13) NOT NULL, - SCHED_TIME BIGINT(13) NOT NULL, - PRIORITY INTEGER NOT NULL, - STATE VARCHAR(16) NOT NULL, - JOB_NAME VARCHAR(200) NULL, - JOB_GROUP VARCHAR(200) NULL, - IS_NONCONCURRENT VARCHAR(1) NULL, - REQUESTS_RECOVERY VARCHAR(1) NULL, - PRIMARY KEY (SCHED_NAME,ENTRY_ID) -); - -CREATE TABLE QRTZ_SCHEDULER_STATE - ( - SCHED_NAME VARCHAR(120) NOT NULL, - INSTANCE_NAME VARCHAR(200) NOT NULL, - LAST_CHECKIN_TIME BIGINT(13) NOT NULL, - CHECKIN_INTERVAL BIGINT(13) NOT NULL, - PRIMARY KEY (SCHED_NAME,INSTANCE_NAME) -); - -CREATE TABLE QRTZ_LOCKS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - LOCK_NAME VARCHAR(40) NOT NULL, - PRIMARY KEY (SCHED_NAME,LOCK_NAME) -); - - -commit; diff --git a/branch-dianping/pom.xml b/branch-dianping/pom.xml deleted file mode 100644 index b7659262..00000000 --- a/branch-dianping/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - 4.0.0 - com.dianping - dianping-job - 0.0.1-SNAPSHOT - pom - - - dianping-job-web - dianping-job-client - dianping-job-client-demo - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - UTF8 - - - - - - \ No newline at end of file diff --git a/branch-dianping/doc/db/tables_mysql-for-dianping-wed.sql b/doc/db/tables_mysql-for-dianping-wed.sql similarity index 100% rename from branch-dianping/doc/db/tables_mysql-for-dianping-wed.sql rename to doc/db/tables_mysql-for-dianping-wed.sql diff --git a/pom.xml b/pom.xml index 09f37cb3..83db59fd 100644 --- a/pom.xml +++ b/pom.xml @@ -3,10 +3,13 @@ 4.0.0 com.xxl xxl-job - 0.0.1-SNAPSHOT + 1.1.1-SNAPSHOT pom xxl-job-admin + xxl-job-client + xxl-job-client-demo + xxl-job-simple diff --git a/xxl-job-admin/.classpath b/xxl-job-admin/.classpath new file mode 100644 index 00000000..803d7e0d --- /dev/null +++ b/xxl-job-admin/.classpath @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xxl-job-admin/.gitignore b/xxl-job-admin/.gitignore new file mode 100644 index 00000000..b83d2226 --- /dev/null +++ b/xxl-job-admin/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/xxl-job-admin/.project b/xxl-job-admin/.project new file mode 100644 index 00000000..6d8ec400 --- /dev/null +++ b/xxl-job-admin/.project @@ -0,0 +1,42 @@ + + + xxl-job-admin + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/xxl-job-admin/.settings/.jsdtscope b/xxl-job-admin/.settings/.jsdtscope new file mode 100644 index 00000000..a2d71f4f --- /dev/null +++ b/xxl-job-admin/.settings/.jsdtscope @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/xxl-job-admin/.settings/org.eclipse.core.resources.prefs b/xxl-job-admin/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..8fd0b3a2 --- /dev/null +++ b/xxl-job-admin/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF8 diff --git a/xxl-job-admin/.settings/org.eclipse.jdt.core.prefs b/xxl-job-admin/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..62a317c8 --- /dev/null +++ b/xxl-job-admin/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/xxl-job-admin/.settings/org.eclipse.m2e.core.prefs b/xxl-job-admin/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..14b697b7 --- /dev/null +++ b/xxl-job-admin/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/xxl-job-admin/.settings/org.eclipse.wst.common.component b/xxl-job-admin/.settings/org.eclipse.wst.common.component new file mode 100644 index 00000000..31b4fad4 --- /dev/null +++ b/xxl-job-admin/.settings/org.eclipse.wst.common.component @@ -0,0 +1,13 @@ + + + + + + + + uses + + + + + diff --git a/xxl-job-admin/.settings/org.eclipse.wst.common.project.facet.core.xml b/xxl-job-admin/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 00000000..6f361dd8 --- /dev/null +++ b/xxl-job-admin/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/xxl-job-admin/.settings/org.eclipse.wst.jsdt.ui.superType.container b/xxl-job-admin/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 00000000..3bd5d0a4 --- /dev/null +++ b/xxl-job-admin/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/xxl-job-admin/.settings/org.eclipse.wst.jsdt.ui.superType.name b/xxl-job-admin/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 00000000..05bd71b6 --- /dev/null +++ b/xxl-job-admin/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/xxl-job-admin/.settings/org.eclipse.wst.validation.prefs b/xxl-job-admin/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 00000000..6f1cba68 --- /dev/null +++ b/xxl-job-admin/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml index bd3e2f6d..4fd7a6df 100644 --- a/xxl-job-admin/pom.xml +++ b/xxl-job-admin/pom.xml @@ -4,11 +4,12 @@ com.xxl xxl-job - 0.0.1-SNAPSHOT + 1.1.1-SNAPSHOT xxl-job-admin + 1.1.2-SNAPSHOT war - + 3.2.14.RELEASE @@ -128,13 +129,20 @@ quartz 2.2.1 - + + org.apache.httpcomponents + httpclient + 4.3.6 + + + com.xxl - xxl-job-core - 0.0.1-SNAPSHOT + xxl-job-client + 1.1.2-SNAPSHOT - --> diff --git a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/controller/IndexController.java b/xxl-job-admin/src/main/java/com/xxl/job/controller/IndexController.java similarity index 92% rename from branch-dianping/dianping-job-web/src/main/java/com/dianping/job/controller/IndexController.java rename to xxl-job-admin/src/main/java/com/xxl/job/controller/IndexController.java index fb2036c5..fc7fd83f 100644 --- a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/controller/IndexController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/controller/IndexController.java @@ -1,4 +1,4 @@ -package com.dianping.job.controller; +package com.xxl.job.controller; import java.io.UnsupportedEncodingException; import java.util.HashMap; @@ -18,10 +18,10 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; -import com.dianping.job.client.handler.HandlerRepository; -import com.dianping.job.core.model.ReturnT; -import com.dianping.job.core.util.DynamicSchedulerUtil; -import com.dianping.job.service.job.HttpJobBean; +import com.xxl.job.client.handler.HandlerRepository; +import com.xxl.job.core.model.ReturnT; +import com.xxl.job.core.util.DynamicSchedulerUtil; +import com.xxl.job.service.job.HttpJobBean; /** * index controller diff --git a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/core/model/ReturnT.java b/xxl-job-admin/src/main/java/com/xxl/job/core/model/ReturnT.java similarity index 91% rename from branch-dianping/dianping-job-web/src/main/java/com/dianping/job/core/model/ReturnT.java rename to xxl-job-admin/src/main/java/com/xxl/job/core/model/ReturnT.java index b09d49f1..aaeb3f51 100644 --- a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/core/model/ReturnT.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/core/model/ReturnT.java @@ -1,4 +1,4 @@ -package com.dianping.job.core.model; +package com.xxl.job.core.model; /** * common return diff --git a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/core/model/DianpingJobLog.java b/xxl-job-admin/src/main/java/com/xxl/job/core/model/XxlJobLog.java similarity index 86% rename from branch-dianping/dianping-job-web/src/main/java/com/dianping/job/core/model/DianpingJobLog.java rename to xxl-job-admin/src/main/java/com/xxl/job/core/model/XxlJobLog.java index 00671ad0..144a2e1c 100644 --- a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/core/model/DianpingJobLog.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/core/model/XxlJobLog.java @@ -1,12 +1,12 @@ -package com.dianping.job.core.model; +package com.xxl.job.core.model; import java.util.Date; /** - * dianping job log, used to track trigger process + * xxl-job log, used to track trigger process * @author xuxueli 2015-12-19 23:19:09 */ -public class DianpingJobLog { +public class XxlJobLog { private String jobTriggerUuid; private String jobHandleName; @@ -70,7 +70,7 @@ public class DianpingJobLog { @Override public String toString() { - return "DianpingJobLog [jobTriggerUuid=" + jobTriggerUuid + ", jobHandleName=" + jobHandleName + return "XxlJobLog [jobTriggerUuid=" + jobTriggerUuid + ", jobHandleName=" + jobHandleName + ", triggerTime=" + triggerTime + ", triggerStatus=" + triggerStatus + ", triggerDetailLog=" + triggerDetailLog + ", handleTime=" + handleTime + ", handleStatus=" + handleStatus + ", handleDetailLog=" + handleDetailLog + "]"; diff --git a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/core/util/DynamicSchedulerUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/core/util/DynamicSchedulerUtil.java similarity index 97% rename from branch-dianping/dianping-job-web/src/main/java/com/dianping/job/core/util/DynamicSchedulerUtil.java rename to xxl-job-admin/src/main/java/com/xxl/job/core/util/DynamicSchedulerUtil.java index c995b5c9..b1b696c0 100644 --- a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/core/util/DynamicSchedulerUtil.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/core/util/DynamicSchedulerUtil.java @@ -1,4 +1,4 @@ -package com.dianping.job.core.util; +package com.xxl.job.core.util; import java.util.ArrayList; import java.util.Date; diff --git a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/service/ITriggerService.java b/xxl-job-admin/src/main/java/com/xxl/job/service/ITriggerService.java similarity index 77% rename from branch-dianping/dianping-job-web/src/main/java/com/dianping/job/service/ITriggerService.java rename to xxl-job-admin/src/main/java/com/xxl/job/service/ITriggerService.java index a7ce637c..642aae86 100644 --- a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/service/ITriggerService.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/service/ITriggerService.java @@ -1,4 +1,4 @@ -package com.dianping.job.service; +package com.xxl.job.service; /** * local trigger, only exists in local jvm diff --git a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/service/impl/TriggerServiceImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/service/impl/TriggerServiceImpl.java similarity index 70% rename from branch-dianping/dianping-job-web/src/main/java/com/dianping/job/service/impl/TriggerServiceImpl.java rename to xxl-job-admin/src/main/java/com/xxl/job/service/impl/TriggerServiceImpl.java index 361c2a44..1f92eaa5 100644 --- a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/service/impl/TriggerServiceImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/service/impl/TriggerServiceImpl.java @@ -1,10 +1,10 @@ -package com.dianping.job.service.impl; +package com.xxl.job.service.impl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import com.dianping.job.service.ITriggerService; +import com.xxl.job.service.ITriggerService; /** * local trigger, only exists in local jvm @@ -15,7 +15,7 @@ public class TriggerServiceImpl implements ITriggerService { private static transient Logger logger = LoggerFactory.getLogger(TriggerServiceImpl.class); public void beat() { - logger.info(">>>>>>>>>>> dianping-clock beat success."); + logger.info(">>>>>>>>>>> xxl-job beat success."); } } diff --git a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/service/job/HttpJobBean.java b/xxl-job-admin/src/main/java/com/xxl/job/service/job/HttpJobBean.java similarity index 80% rename from branch-dianping/dianping-job-web/src/main/java/com/dianping/job/service/job/HttpJobBean.java rename to xxl-job-admin/src/main/java/com/xxl/job/service/job/HttpJobBean.java index 101cc396..d148ae77 100644 --- a/branch-dianping/dianping-job-web/src/main/java/com/dianping/job/service/job/HttpJobBean.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/service/job/HttpJobBean.java @@ -1,4 +1,4 @@ -package com.dianping.job.service.job; +package com.xxl.job.service.job; import java.io.IOException; import java.io.PrintWriter; @@ -27,10 +27,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.quartz.QuartzJobBean; -import com.dianping.job.client.handler.HandlerRepository; -import com.dianping.job.client.handler.IJobHandler.JobTriggerStatus; -import com.dianping.job.core.model.DianpingJobLog; -import com.dianping.job.core.util.DynamicSchedulerUtil; +import com.xxl.job.client.handler.HandlerRepository; +import com.xxl.job.client.handler.IJobHandler.JobTriggerStatus; +import com.xxl.job.core.model.XxlJobLog; +import com.xxl.job.core.util.DynamicSchedulerUtil; /** * http job bean @@ -58,17 +58,17 @@ public class HttpJobBean extends QuartzJobBean { String job_url = params.get(DynamicSchedulerUtil.job_url); triggerPost(job_url, params); - logger.info(">>>>>>>>>>> dianping-clock run :jobId:{}, group:{}, jobDataMap:{}", + logger.info(">>>>>>>>>>> xxl-job run :jobId:{}, group:{}, jobDataMap:{}", new Object[]{triggerKey, triggerGroup, jobDataMap}); } public static void triggerPost(String reqURL, Map params){ // save log - DianpingJobLog jobLog = new DianpingJobLog(); + XxlJobLog jobLog = new XxlJobLog(); jobLog.setJobTriggerUuid(UUID.randomUUID().toString()); jobLog.setJobHandleName(params.get(HandlerRepository.handleName)); jobLog.setTriggerTime(new Date()); - logger.info(">>>>>>>>>>> dianping-clock trigger start :jobLog:{}", jobLog); + logger.info(">>>>>>>>>>> xxl-job trigger start :jobLog:{}", jobLog); // post String responseContent = null; @@ -91,7 +91,7 @@ public class HttpJobBean extends QuartzJobBean { responseContent = EntityUtils.toString(entity, "UTF-8"); EntityUtils.consume(entity); } - logger.info(">>>>>>>>>>> dianping-clock trigger ing :jobLog:{}, response:{}, responseContent:{}", jobLog, response, responseContent); + logger.info(">>>>>>>>>>> xxl-job trigger ing :jobLog:{}, response:{}, responseContent:{}", jobLog, response, responseContent); } catch (Exception e) { e.printStackTrace(); @@ -117,17 +117,17 @@ public class HttpJobBean extends QuartzJobBean { jobLog.setTriggerDetailLog(jobLog.getTriggerDetailLog().substring(0, 1000)); } - logger.info(">>>>>>>>>>> dianping-clock trigger end :jobLog:{}", jobLog); + logger.info(">>>>>>>>>>> xxl-job trigger end :jobLog:{}", jobLog); } } public static void main(String[] args) { - String url = "http://localhost:8080/dianping-job-client-demo/dianpingJobServlet"; + String url = "http://localhost:8080/xxl-job-client-demo/xxlJobServlet"; for (int i = 0; i < 3; i++) { Map params = new HashMap(); - params.put(HandlerRepository.handleName, "com.dianping.job.service.handler.DemoJobHandler"); + params.put(HandlerRepository.handleName, "com.xxl.job.service.handler.DemoJobHandler"); params.put(HandlerRepository.triggerUuid, i+""); params.put("key", i+""); diff --git a/xxl-job-admin/src/main/resources/applicationcontext-base.xml b/xxl-job-admin/src/main/resources/applicationcontext-base.xml index e63b7982..a05aeeea 100644 --- a/xxl-job-admin/src/main/resources/applicationcontext-base.xml +++ b/xxl-job-admin/src/main/resources/applicationcontext-base.xml @@ -10,7 +10,7 @@ http://www.springframework.org/schema/util/spring-util.xsd"> - + @@ -19,11 +19,6 @@ - - - - - diff --git a/xxl-job-admin/src/main/resources/applicationcontext-database.xml b/xxl-job-admin/src/main/resources/applicationcontext-database.xml index cdb291a1..a72057d1 100644 --- a/xxl-job-admin/src/main/resources/applicationcontext-database.xml +++ b/xxl-job-admin/src/main/resources/applicationcontext-database.xml @@ -15,7 +15,6 @@ - @@ -35,7 +34,7 @@ - + diff --git a/xxl-job-admin/src/main/resources/applicationcontext-trigger-db.xml b/xxl-job-admin/src/main/resources/applicationcontext-trigger-db.xml index f3ba1019..58e268f7 100644 --- a/xxl-job-admin/src/main/resources/applicationcontext-trigger-db.xml +++ b/xxl-job-admin/src/main/resources/applicationcontext-trigger-db.xml @@ -9,37 +9,16 @@ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> - - - - - - - - - - - - - - - - - - - - - - - - + + + diff --git a/xxl-job-admin/src/main/resources/applicationcontext-trigger-local.xml b/xxl-job-admin/src/main/resources/applicationcontext-trigger-local.xml index cf0f3c8d..911aba64 100644 --- a/xxl-job-admin/src/main/resources/applicationcontext-trigger-local.xml +++ b/xxl-job-admin/src/main/resources/applicationcontext-trigger-local.xml @@ -20,11 +20,11 @@ - - + + - + diff --git a/xxl-job-admin/src/main/resources/applicationcontext-tx.xml b/xxl-job-admin/src/main/resources/applicationcontext-tx.xml index 2511344b..709ad8ca 100644 --- a/xxl-job-admin/src/main/resources/applicationcontext-tx.xml +++ b/xxl-job-admin/src/main/resources/applicationcontext-tx.xml @@ -12,15 +12,12 @@ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> - - - @@ -33,11 +30,8 @@ - - - diff --git a/xxl-job-admin/src/main/resources/log4j.properties b/xxl-job-admin/src/main/resources/log4j.properties index 60ca14ad..f31fe38f 100644 --- a/xxl-job-admin/src/main/resources/log4j.properties +++ b/xxl-job-admin/src/main/resources/log4j.properties @@ -1,10 +1,10 @@ -log4j.rootLogger=info,console +log4j.rootLogger=info,console,logFile log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout -log4j.appender.console.layout.ConversionPattern=%d - xxl-job-demo - %p [%c] - <%m>%n +log4j.appender.console.layout.ConversionPattern=%d - xxl-job-admin - %p [%c] - <%m>%n log4j.appender.logFile=org.apache.log4j.DailyRollingFileAppender -log4j.appender.logFile.File=${catalina.base}/logs/xxl-job-demo.log +log4j.appender.logFile.File=${catalina.base}/logs/xxl-job-admin.log log4j.appender.logFile.layout=org.apache.log4j.PatternLayout -log4j.appender.logFile.layout.ConversionPattern=%d - xxl-job-demo - %p [%c] - <%m>%n +log4j.appender.logFile.layout.ConversionPattern=%d - xxl-job-admin - %p [%c] - <%m>%n diff --git a/xxl-job-admin/src/main/resources/quartz.properties b/xxl-job-admin/src/main/resources/quartz.properties index a1e68509..ecda6e90 100644 --- a/xxl-job-admin/src/main/resources/quartz.properties +++ b/xxl-job-admin/src/main/resources/quartz.properties @@ -18,6 +18,7 @@ org.quartz.jobStore.misfireThreshold: 60000 #org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore # for cluster +#org.quartz.jobStore.tablePrefix = WED_qrtz_ org.quartz.scheduler.instanceId: AUTO org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.isClustered: true diff --git a/xxl-job-admin/src/main/resources/springmvc-context.xml b/xxl-job-admin/src/main/resources/springmvc-context.xml index b44ff95f..6d7548c3 100644 --- a/xxl-job-admin/src/main/resources/springmvc-context.xml +++ b/xxl-job-admin/src/main/resources/springmvc-context.xml @@ -18,34 +18,35 @@ http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> - Spring-web MVC配置 - - + - - + + - - + + - - - - - + + + + + - + + --> \ No newline at end of file diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl index 94a4347e..bf6f235f 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl @@ -37,8 +37,6 @@ - - @@ -47,81 +45,15 @@ <#macro commonHeader>
- - - - -
- <#macro commonLeft> @@ -131,20 +63,9 @@ @@ -234,8 +155,8 @@ Version 1.0 Copyright © 2015-2015   - github  - cnblog. + github  + cnblog. All rights reserved. diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/job/help.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/job/help.ftl index 0c72e977..9ce7eaf6 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/job/help.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/job/help.ftl @@ -1,7 +1,7 @@ - AdminLTE 2 | Dashboard + 调度中心 <#import "/common/common.macro.ftl" as netCommon> <@netCommon.commonStyle /> @@ -26,18 +26,41 @@
-

简介:xxl-job

-

调度管理平台:基于quartz封装实现的的集群任务调度管理平台.

+

简介:XXL_JOB

+

基于quartz封装实现的的集群任务调度管理平台.

- -
+

特点:

1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手.

2、动态:支持动态修改任务状态,动态暂停/恢复任务,即时生效.

3、集群:任务信息持久化到mysql中,支持Job服务器集群(高可用),一个任务只会在其中一台服务器上执行.

+
+

分层模型:

+

1、基础:基于quartz封装底层调度层,通过CORN自定义任务执行周期,最终执行自定义JobBean的execute方法,如需多个任务,需要开发多个JobBean实现.

+

2、分层:上述基础调度模型存在一定局限,调度层和任务层耦合,当新任务上线势必影响任务的正常调度,因此规划将调度系统分层为:调度层 + 任务层 + 通讯层.

+

+

+
+

》调度模块:维护任务的调度信息,负责定时/周期性的发出调度请求.

+

》任务模块:具体的任务逻辑,负责接收调度模块的调度请求,执行任务逻辑.

+

》通讯模块:负责调度模块和任务模块之间的通讯.

+

(总而言之,一条完整任务由 “调度信息” 和 “任务信息” 组成.)

+
+
+

+
+ +
+

调度属性解析 : 发出HTTP调度请求

+

1、调度Key【必填】:调度信息的全局唯一标识.

+

2、调度Corn【必填】:调度执行的时间表达式.

+

3、调度描述【必填】:调度的简述.

+

4、调度URL【必填】:调度执行时发出HTTP请求的目标URL地址.

+

5、+args【选填】:调度执行时发出HTTP请求的附带的POST参数.

+
diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/job/index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/job/index.ftl index e5fedb3a..62c41fb5 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/job/index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/job/index.ftl @@ -19,10 +19,10 @@
-

使用教程调度管理平台

+

调度中心调度管理

@@ -32,17 +32,17 @@
-

任务列表

- +

调度列表

+
- + - - + + @@ -53,11 +53,13 @@ - + @@ -87,10 +90,10 @@ - + - - + + @@ -114,30 +117,35 @@
任务ID调度key cronJob类路径简介参数 状态 操作
${item['TriggerKey'].name} ${item['Trigger'].cronExpression}${item['JobDetail'].jobClass} - <#if item['JobDetail'].jobDataMap?exists> - <#assign job_desc=item['JobDetail'].jobDataMap['job_desc'] /> - ${job_desc} + <#assign jobDataMap = item['JobDetail'].jobDataMap /> + <#if jobDataMap?exists && jobDataMap?keys?size gt 0> + <#list jobDataMap?keys as key> + ${key} = ${jobDataMap[key]}
+
@@ -77,8 +79,9 @@ <#elseif item['TriggerState'] == 'PAUSED'> - + +

任务ID调度key cronJob类路径简介参数 状态 操作
- + - - + + @@ -53,13 +53,11 @@ - + @@ -90,10 +87,10 @@ - + - - + + @@ -117,35 +114,30 @@
调度key任务ID cron参数Job类路径简介 状态 操作
${item['TriggerKey'].name} ${item['Trigger'].cronExpression}${item['JobDetail'].jobClass} - <#assign jobDataMap = item['JobDetail'].jobDataMap /> - <#if jobDataMap?exists && jobDataMap?keys?size gt 0> - <#list jobDataMap?keys as key> - ${key} = ${jobDataMap[key]}
- + <#if item['JobDetail'].jobDataMap?exists> + <#assign job_desc=item['JobDetail'].jobDataMap['job_desc'] /> + ${job_desc}
@@ -79,9 +77,8 @@ <#elseif item['TriggerState'] == 'PAUSED'> - + -

调度key任务ID cron参数Job类路径简介 状态 操作