提交 8a8d7a5c authored 作者: xueli.xue's avatar xueli.xue

coding snapshot

上级 20ab6b14
...@@ -251,11 +251,21 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,通过重写L ...@@ -251,11 +251,21 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,通过重写L
- 2、执行器异步回调执行日志; - 2、执行器异步回调执行日志;
- 3、【重要】在 “调度中心” 支持HA的基础上,扩展执行器的Failover支持,支持配置多执行期地址; - 3、【重要】在 “调度中心” 支持HA的基础上,扩展执行器的Failover支持,支持配置多执行期地址;
#### 4.6 版本 V1.4.0 新特性
- 1、任务依赖: 通过事件触发方式实现, 任务执行成功并回调SUCCESS时, 会主动触发一次依赖任务的调度;
- 2、调度中心任务属性调整: jobName改为系统生成, 新增任务时不需要指定;
- 3、问题修复:
- 1.1、执行器jetty关闭优化,解决一处可能导致jetty无法关闭的问题;
- 1.2、执行器任务终止时,执行队列回调优化,解决一处导致任务无法回调的问题;
- 1.3、调度中心中列表分页参数优化,解决一处因服务器限制post长度而引起的问题;
- 1.4、执行器Jobhandler注解优化,解决一处因事务代理导致的容器无法加载JobHandler的问题;
- 1.5、远程调度优化,禁用retry策略,解决一处可能导致重复调用的问题;
#### 规划中 #### 规划中
- 1、任务终止时,任务队列中调度回调通过被终止的接口;
- 2、任务执行规则自定义:假如前一个任务正在执行,后续调度执行规则支持自定义; - 2、任务执行规则自定义:假如前一个任务正在执行,后续调度执行规则支持自定义;
串行(默认,当前逻辑):后续调度入调度队列; 串行(默认,当前逻辑):后续调度入调度队列;
并行:后续调度并行执行; 并行:后续调度并行执行;
Pass:后续调度被Pass; Pass:后续调度被Pass;
- 3、兼容oracle; - 3、兼容oracle;
- 4、任务依赖;
...@@ -143,7 +143,9 @@ CREATE TABLE XXL_JOB_QRTZ_LOCKS ...@@ -143,7 +143,9 @@ CREATE TABLE XXL_JOB_QRTZ_LOCKS
PRIMARY KEY (SCHED_NAME,LOCK_NAME) PRIMARY KEY (SCHED_NAME,LOCK_NAME)
); );
CREATE TABLE `xxl_job_qrtz_trigger_info` (
CREATE TABLE XXL_JOB_QRTZ_TRIGGER_INFO (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`job_group` varchar(255) NOT NULL COMMENT '任务组', `job_group` varchar(255) NOT NULL COMMENT '任务组',
`job_name` varchar(255) NOT NULL COMMENT '任务名', `job_name` varchar(255) NOT NULL COMMENT '任务名',
...@@ -162,9 +164,9 @@ CREATE TABLE `xxl_job_qrtz_trigger_info` ( ...@@ -162,9 +164,9 @@ CREATE TABLE `xxl_job_qrtz_trigger_info` (
`glue_source` text COMMENT 'GLUE源代码', `glue_source` text COMMENT 'GLUE源代码',
`glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注', `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `xxl_job_qrtz_trigger_log` ( CREATE TABLE XXL_JOB_QRTZ_TRIGGER_LOG (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`job_group` varchar(255) NOT NULL COMMENT '任务组', `job_group` varchar(255) NOT NULL COMMENT '任务组',
`job_name` varchar(255) NOT NULL COMMENT '任务名', `job_name` varchar(255) NOT NULL COMMENT '任务名',
...@@ -181,9 +183,9 @@ CREATE TABLE `xxl_job_qrtz_trigger_log` ( ...@@ -181,9 +183,9 @@ CREATE TABLE `xxl_job_qrtz_trigger_log` (
`handle_status` varchar(255) DEFAULT NULL COMMENT '执行-状态', `handle_status` varchar(255) DEFAULT NULL COMMENT '执行-状态',
`handle_msg` varchar(2048) DEFAULT NULL COMMENT '执行-日志', `handle_msg` varchar(2048) DEFAULT NULL COMMENT '执行-日志',
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `xxl_job_qrtz_trigger_logglue` ( CREATE TABLE XXL_JOB_QRTZ_TRIGGER_LOGGLUE (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`job_group` varchar(255) NOT NULL, `job_group` varchar(255) NOT NULL,
`job_name` varchar(255) NOT NULL, `job_name` varchar(255) NOT NULL,
...@@ -192,7 +194,7 @@ CREATE TABLE `xxl_job_qrtz_trigger_logglue` ( ...@@ -192,7 +194,7 @@ CREATE TABLE `xxl_job_qrtz_trigger_logglue` (
`add_time` timestamp NULL DEFAULT NULL, `add_time` timestamp NULL DEFAULT NULL,
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
......
...@@ -35,9 +35,9 @@ public class JobInfoController { ...@@ -35,9 +35,9 @@ public class JobInfoController {
@ResponseBody @ResponseBody
public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start, public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start,
@RequestParam(required = false, defaultValue = "10") int length, @RequestParam(required = false, defaultValue = "10") int length,
String jobGroup, String jobName, String filterTime) { String jobGroup, String jobDesc, String filterTime) {
return xxlJobService.pageList(start, length, jobGroup, jobName, filterTime); return xxlJobService.pageList(start, length, jobGroup, jobDesc, filterTime);
} }
@RequestMapping("/add") @RequestMapping("/add")
...@@ -47,7 +47,7 @@ public class JobInfoController { ...@@ -47,7 +47,7 @@ public class JobInfoController {
String author, String alarmEmail, int alarmThreshold, String author, String alarmEmail, int alarmThreshold,
int glueSwitch, String glueSource, String glueRemark) { int glueSwitch, String glueSource, String glueRemark) {
return xxlJobService.add(jobGroup, jobName, jobCron, jobDesc, executorAddress, executorHandler, executorParam, return xxlJobService.add(jobGroup, jobCron, jobDesc, executorAddress, executorHandler, executorParam,
author, alarmEmail, alarmThreshold, glueSwitch, glueSource, glueRemark); author, alarmEmail, alarmThreshold, glueSwitch, glueSource, glueRemark);
} }
......
...@@ -47,6 +47,13 @@ public class JobLogController { ...@@ -47,6 +47,13 @@ public class JobLogController {
model.addAttribute("JobGroupList", JobGroupEnum.values()); model.addAttribute("JobGroupList", JobGroupEnum.values());
return "joblog/joblog.index"; return "joblog/joblog.index";
} }
@RequestMapping("/getJobsByGroup")
@ResponseBody
public ReturnT<List<XxlJobLog>> listJobByGroup(String jobGroup){
List<XxlJobLog> list = xxlJobInfoDao.getJobsByGroup(jobGroup);
return new ReturnT<List<XxlJobLog>>(list);
}
@RequestMapping("/pageList") @RequestMapping("/pageList")
@ResponseBody @ResponseBody
......
...@@ -7,9 +7,9 @@ package com.xxl.job.admin.core.constant; ...@@ -7,9 +7,9 @@ package com.xxl.job.admin.core.constant;
public class Constants { public class Constants {
public enum JobGroupEnum{ public enum JobGroupEnum{
DEFAULT("默认"), defaults("默认"),
WAIMAI("外卖"), waimai("外卖"),
MOVIE("电影"); movie("电影");
private String desc; private String desc;
private JobGroupEnum(String desc){ private JobGroupEnum(String desc){
this.desc = desc; this.desc = desc;
......
...@@ -3,6 +3,7 @@ package com.xxl.job.admin.dao; ...@@ -3,6 +3,7 @@ package com.xxl.job.admin.dao;
import java.util.List; import java.util.List;
import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.core.model.XxlJobLog;
/** /**
...@@ -11,8 +12,8 @@ import com.xxl.job.admin.core.model.XxlJobInfo; ...@@ -11,8 +12,8 @@ import com.xxl.job.admin.core.model.XxlJobInfo;
*/ */
public interface IXxlJobInfoDao { public interface IXxlJobInfoDao {
public List<XxlJobInfo> pageList(int offset, int pagesize, String jobGroup, String jobName); public List<XxlJobInfo> pageList(int offset, int pagesize, String jobGroup, String jobDesc);
public int pageListCount(int offset, int pagesize, String jobGroup, String jobName); public int pageListCount(int offset, int pagesize, String jobGroup, String jobDesc);
public int save(XxlJobInfo info); public int save(XxlJobInfo info);
...@@ -21,5 +22,6 @@ public interface IXxlJobInfoDao { ...@@ -21,5 +22,6 @@ public interface IXxlJobInfoDao {
public int update(XxlJobInfo item); public int update(XxlJobInfo item);
public int delete(String jobGroup, String jobName); public int delete(String jobGroup, String jobName);
public List<XxlJobLog> getJobsByGroup(String jobGroup);
} }
...@@ -5,6 +5,7 @@ import java.util.List; ...@@ -5,6 +5,7 @@ import java.util.List;
import javax.annotation.Resource; import javax.annotation.Resource;
import com.xxl.job.admin.core.model.XxlJobLog;
import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
...@@ -22,23 +23,23 @@ public class XxlJobInfoDaoImpl implements IXxlJobInfoDao { ...@@ -22,23 +23,23 @@ public class XxlJobInfoDaoImpl implements IXxlJobInfoDao {
public SqlSessionTemplate sqlSessionTemplate; public SqlSessionTemplate sqlSessionTemplate;
@Override @Override
public List<XxlJobInfo> pageList(int offset, int pagesize, String jobGroup, String jobName) { public List<XxlJobInfo> pageList(int offset, int pagesize, String jobGroup, String jobDesc) {
HashMap<String, Object> params = new HashMap<String, Object>(); HashMap<String, Object> params = new HashMap<String, Object>();
params.put("offset", offset); params.put("offset", offset);
params.put("pagesize", pagesize); params.put("pagesize", pagesize);
params.put("jobGroup", jobGroup); params.put("jobGroup", jobGroup);
params.put("jobName", jobName); params.put("jobDesc", jobDesc);
return sqlSessionTemplate.selectList("XxlJobInfoMapper.pageList", params); return sqlSessionTemplate.selectList("XxlJobInfoMapper.pageList", params);
} }
@Override @Override
public int pageListCount(int offset, int pagesize, String jobGroup, String jobName) { public int pageListCount(int offset, int pagesize, String jobGroup, String jobDesc) {
HashMap<String, Object> params = new HashMap<String, Object>(); HashMap<String, Object> params = new HashMap<String, Object>();
params.put("offset", offset); params.put("offset", offset);
params.put("pagesize", pagesize); params.put("pagesize", pagesize);
params.put("jobGroup", jobGroup); params.put("jobGroup", jobGroup);
params.put("jobName", jobName); params.put("jobDesc", jobDesc);
return sqlSessionTemplate.selectOne("XxlJobInfoMapper.pageListCount", params); return sqlSessionTemplate.selectOne("XxlJobInfoMapper.pageListCount", params);
} }
...@@ -70,5 +71,10 @@ public class XxlJobInfoDaoImpl implements IXxlJobInfoDao { ...@@ -70,5 +71,10 @@ public class XxlJobInfoDaoImpl implements IXxlJobInfoDao {
return sqlSessionTemplate.update("XxlJobInfoMapper.delete", params); return sqlSessionTemplate.update("XxlJobInfoMapper.delete", params);
} }
@Override
public List<XxlJobLog> getJobsByGroup(String jobGroup) {
return sqlSessionTemplate.selectList("XxlJobInfoMapper.getJobsByGroup", jobGroup);
}
} }
...@@ -11,9 +11,9 @@ import com.xxl.job.admin.core.model.ReturnT; ...@@ -11,9 +11,9 @@ import com.xxl.job.admin.core.model.ReturnT;
*/ */
public interface IXxlJobService { public interface IXxlJobService {
public Map<String, Object> pageList(int start, int length, String jobGroup, String jobName, String filterTime); public Map<String, Object> pageList(int start, int length, String jobGroup, String jobDesc, String filterTime);
public ReturnT<String> add(String jobGroup, String jobName, String jobCron, String jobDesc, public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,
String executorAddress, String executorHandler, String executorParam, String executorAddress, String executorHandler, String executorParam,
String author, String alarmEmail, int alarmThreshold, String author, String alarmEmail, int alarmThreshold,
int glueSwitch, String glueSource, String glueRemark); int glueSwitch, String glueSource, String glueRemark);
......
...@@ -3,6 +3,7 @@ package com.xxl.job.admin.service.impl; ...@@ -3,6 +3,7 @@ package com.xxl.job.admin.service.impl;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import javax.annotation.Resource; import javax.annotation.Resource;
...@@ -36,11 +37,11 @@ public class XxlJobServiceImpl implements IXxlJobService { ...@@ -36,11 +37,11 @@ public class XxlJobServiceImpl implements IXxlJobService {
private IXxlJobLogGlueDao xxlJobLogGlueDao; private IXxlJobLogGlueDao xxlJobLogGlueDao;
@Override @Override
public Map<String, Object> pageList(int start, int length, String jobGroup, String jobName, String filterTime) { public Map<String, Object> pageList(int start, int length, String jobGroup, String jobDesc, String filterTime) {
// page list // page list
List<XxlJobInfo> list = xxlJobInfoDao.pageList(start, length, jobGroup, jobName); List<XxlJobInfo> list = xxlJobInfoDao.pageList(start, length, jobGroup, jobDesc);
int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, jobName); int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, jobDesc);
// fill job info // fill job info
if (list!=null && list.size()>0) { if (list!=null && list.size()>0) {
...@@ -58,7 +59,7 @@ public class XxlJobServiceImpl implements IXxlJobService { ...@@ -58,7 +59,7 @@ public class XxlJobServiceImpl implements IXxlJobService {
} }
@Override @Override
public ReturnT<String> add(String jobGroup, String jobName, String jobCron, String jobDesc, public ReturnT<String> add(String jobGroup, String jobCron, String jobDesc,
String executorAddress, String executorHandler, String executorParam, String executorAddress, String executorHandler, String executorParam,
String author, String alarmEmail, int alarmThreshold, String author, String alarmEmail, int alarmThreshold,
int glueSwitch, String glueSource, String glueRemark) { int glueSwitch, String glueSource, String glueRemark) {
...@@ -66,9 +67,6 @@ public class XxlJobServiceImpl implements IXxlJobService { ...@@ -66,9 +67,6 @@ public class XxlJobServiceImpl implements IXxlJobService {
if (JobGroupEnum.match(jobGroup) == null) { if (JobGroupEnum.match(jobGroup) == null) {
return new ReturnT<String>(500, "请选择“任务组”"); return new ReturnT<String>(500, "请选择“任务组”");
} }
if (StringUtils.isBlank(jobName)) {
return new ReturnT<String>(500, "请输入“任务名”");
}
if (!CronExpression.isValidExpression(jobCron)) { if (!CronExpression.isValidExpression(jobCron)) {
return new ReturnT<String>(500, "请输入格式正确的“Cron”"); return new ReturnT<String>(500, "请输入格式正确的“Cron”");
} }
...@@ -90,7 +88,9 @@ public class XxlJobServiceImpl implements IXxlJobService { ...@@ -90,7 +88,9 @@ public class XxlJobServiceImpl implements IXxlJobService {
if (alarmThreshold < 0) { if (alarmThreshold < 0) {
alarmThreshold = 0; alarmThreshold = 0;
} }
// generate jobName
String jobName = UUID.randomUUID().toString();
try { try {
if (DynamicSchedulerUtil.checkExists(jobName, jobGroup)) { if (DynamicSchedulerUtil.checkExists(jobName, jobGroup)) {
return new ReturnT<String>(500, "此任务已存在,请更换任务组或任务名"); return new ReturnT<String>(500, "此任务已存在,请更换任务组或任务名");
...@@ -99,7 +99,7 @@ public class XxlJobServiceImpl implements IXxlJobService { ...@@ -99,7 +99,7 @@ public class XxlJobServiceImpl implements IXxlJobService {
e1.printStackTrace(); e1.printStackTrace();
return new ReturnT<String>(500, "此任务已存在,请更换任务组或任务名"); return new ReturnT<String>(500, "此任务已存在,请更换任务组或任务名");
} }
// Backup to the database // Backup to the database
XxlJobInfo jobInfo = new XxlJobInfo(); XxlJobInfo jobInfo = new XxlJobInfo();
jobInfo.setJobGroup(jobGroup); jobInfo.setJobGroup(jobGroup);
...@@ -117,7 +117,7 @@ public class XxlJobServiceImpl implements IXxlJobService { ...@@ -117,7 +117,7 @@ public class XxlJobServiceImpl implements IXxlJobService {
jobInfo.setExecutorHandler(executorHandler); jobInfo.setExecutorHandler(executorHandler);
jobInfo.setExecutorParam(executorParam); jobInfo.setExecutorParam(executorParam);
xxlJobInfoDao.save(jobInfo); xxlJobInfoDao.save(jobInfo);
try { try {
// add job 2 quartz // add job 2 quartz
boolean result = DynamicSchedulerUtil.addJob(jobInfo); boolean result = DynamicSchedulerUtil.addJob(jobInfo);
...@@ -168,8 +168,8 @@ public class XxlJobServiceImpl implements IXxlJobService { ...@@ -168,8 +168,8 @@ public class XxlJobServiceImpl implements IXxlJobService {
} }
XxlJobInfo jobInfo = xxlJobInfoDao.load(jobGroup, jobName); XxlJobInfo jobInfo = xxlJobInfoDao.load(jobGroup, jobName);
jobInfo.setJobCron(jobCron);
jobInfo.setJobDesc(jobDesc); jobInfo.setJobDesc(jobDesc);
jobInfo.setJobCron(jobCron);
jobInfo.setAuthor(author); jobInfo.setAuthor(author);
jobInfo.setAlarmEmail(alarmEmail); jobInfo.setAlarmEmail(alarmEmail);
jobInfo.setAlarmThreshold(alarmThreshold); jobInfo.setAlarmThreshold(alarmThreshold);
......
...@@ -5,6 +5,6 @@ log4j.appender.console.layout=org.apache.log4j.PatternLayout ...@@ -5,6 +5,6 @@ log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d - xxl-job-admin - %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=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logFile.File=${catalina.base}/logs/xxl-job-admin.log log4j.appender.logFile.File=/data/applogs/xxl-job/xxl-job-admin.log
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=%d - xxl-job-admin - %p [%c] - <%m>%n log4j.appender.logFile.layout.ConversionPattern=%d - xxl-job-admin - %p [%c] - <%m>%n
...@@ -50,13 +50,13 @@ ...@@ -50,13 +50,13 @@
<select id="pageList" parameterType="java.util.HashMap" resultMap="XxlJobInfo"> <select id="pageList" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
SELECT <include refid="Base_Column_List" /> SELECT <include refid="Base_Column_List" />
FROM xxl_job_qrtz_trigger_info AS t FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
<trim prefix="WHERE" prefixOverrides="AND | OR" > <trim prefix="WHERE" prefixOverrides="AND | OR" >
<if test="jobGroup != null and jobGroup != ''"> <if test="jobGroup != null and jobGroup != ''">
AND t.job_group = #{jobGroup} AND t.job_group = #{jobGroup}
</if> </if>
<if test="jobName != null and jobName != ''"> <if test="jobDesc != null and jobDesc != ''">
AND t.job_name like CONCAT(CONCAT('%', #{jobName}), '%') AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%')
</if> </if>
</trim> </trim>
ORDER BY id DESC ORDER BY id DESC
...@@ -65,19 +65,19 @@ ...@@ -65,19 +65,19 @@
<select id="pageListCount" parameterType="java.util.HashMap" resultType="int"> <select id="pageListCount" parameterType="java.util.HashMap" resultType="int">
SELECT count(1) SELECT count(1)
FROM xxl_job_qrtz_trigger_info AS t FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
<trim prefix="WHERE" prefixOverrides="AND | OR" > <trim prefix="WHERE" prefixOverrides="AND | OR" >
<if test="jobGroup != null and jobGroup != ''"> <if test="jobGroup != null and jobGroup != ''">
AND t.job_group = #{jobGroup} AND t.job_group = #{jobGroup}
</if> </if>
<if test="jobName != null and jobName != ''"> <if test="jobDesc != null and jobDesc != ''">
AND t.job_name like CONCAT(CONCAT('%', #{jobName}), '%') AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%')
</if> </if>
</trim> </trim>
</select> </select>
<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobInfo" useGeneratedKeys="true" keyProperty="id" > <insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobInfo" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO `xxl_job_qrtz_trigger_info` ( INSERT INTO XXL_JOB_QRTZ_TRIGGER_INFO (
job_group, job_group,
job_name, job_name,
job_cron, job_cron,
...@@ -119,13 +119,13 @@ ...@@ -119,13 +119,13 @@
<select id="load" parameterType="java.util.HashMap" resultMap="XxlJobInfo"> <select id="load" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
SELECT <include refid="Base_Column_List" /> SELECT <include refid="Base_Column_List" />
FROM xxl_job_qrtz_trigger_info AS t FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
WHERE t.job_group = #{jobGroup} WHERE t.job_group = #{jobGroup}
AND t.job_name = #{jobName} AND t.job_name = #{jobName}
</select> </select>
<update id="update" parameterType="com.xxl.job.admin.core.model.XxlJobInfo" > <update id="update" parameterType="com.xxl.job.admin.core.model.XxlJobInfo" >
UPDATE `xxl_job_qrtz_trigger_info` UPDATE XXL_JOB_QRTZ_TRIGGER_INFO
SET SET
job_cron = #{jobCron}, job_cron = #{jobCron},
job_desc = #{jobDesc}, job_desc = #{jobDesc},
...@@ -146,10 +146,16 @@ ...@@ -146,10 +146,16 @@
<delete id="delete" parameterType="java.lang.String"> <delete id="delete" parameterType="java.lang.String">
DELETE DELETE
FROM FROM
xxl_job_qrtz_trigger_info XXL_JOB_QRTZ_TRIGGER_INFO
WHERE WHERE
job_group = #{jobGroup} job_group = #{jobGroup}
AND job_name = #{jobName} AND job_name = #{jobName}
</delete> </delete>
<select id="getJobsByGroup" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
SELECT <include refid="Base_Column_List" />
FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
WHERE t.job_group = #{jobGroup}
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
<select id="selectList" parameterType="java.util.HashMap" resultMap="XxlJobLogGlue"> <select id="selectList" parameterType="java.util.HashMap" resultMap="XxlJobLogGlue">
SELECT <include refid="Base_Column_List" /> SELECT <include refid="Base_Column_List" />
FROM xxl_job_qrtz_trigger_logglue AS t FROM XXL_JOB_QRTZ_TRIGGER_LOGGLUE AS t
<trim prefix="WHERE" prefixOverrides="AND | OR" > <trim prefix="WHERE" prefixOverrides="AND | OR" >
<if test="jobGroup != null and jobGroup != ''"> <if test="jobGroup != null and jobGroup != ''">
AND t.job_group = #{jobGroup} AND t.job_group = #{jobGroup}
...@@ -59,10 +59,10 @@ ...@@ -59,10 +59,10 @@
</select> </select>
<delete id="removeOld" parameterType="java.util.HashMap" > <delete id="removeOld" parameterType="java.util.HashMap" >
DELETE FROM xxl_job_qrtz_trigger_logglue DELETE FROM XXL_JOB_QRTZ_TRIGGER_LOGGLUE
WHERE id NOT in( WHERE id NOT in(
SELECT id FROM( SELECT id FROM(
SELECT id FROM xxl_job_qrtz_trigger_logglue SELECT id FROM XXL_JOB_QRTZ_TRIGGER_LOGGLUE
WHERE `job_group` = #{jobGroup} and `job_name` = #{jobName} WHERE `job_group` = #{jobGroup} and `job_name` = #{jobName}
ORDER BY update_time desc ORDER BY update_time desc
LIMIT 0, #{limit} LIMIT 0, #{limit}
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
</delete> </delete>
<delete id="delete" parameterType="java.util.HashMap" > <delete id="delete" parameterType="java.util.HashMap" >
DELETE FROM xxl_job_qrtz_trigger_logglue DELETE FROM XXL_JOB_QRTZ_TRIGGER_LOGGLUE
WHERE job_group = #{jobGroup} and job_name = #{jobName} WHERE job_group = #{jobGroup} and job_name = #{jobName}
</delete> </delete>
......
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
<select id="pageListCount" parameterType="java.util.HashMap" resultType="int"> <select id="pageListCount" parameterType="java.util.HashMap" resultType="int">
SELECT count(1) SELECT count(1)
FROM xxl_job_qrtz_trigger_log AS t FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
<trim prefix="WHERE" prefixOverrides="AND | OR" > <trim prefix="WHERE" prefixOverrides="AND | OR" >
<if test="jobGroup != null and jobGroup != ''"> <if test="jobGroup != null and jobGroup != ''">
AND t.job_group = #{jobGroup} AND t.job_group = #{jobGroup}
...@@ -86,19 +86,19 @@ ...@@ -86,19 +86,19 @@
<select id="load" parameterType="java.lang.Integer" resultMap="XxlJobLog"> <select id="load" parameterType="java.lang.Integer" resultMap="XxlJobLog">
SELECT <include refid="Base_Column_List" /> SELECT <include refid="Base_Column_List" />
FROM xxl_job_qrtz_trigger_log AS t FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
WHERE t.id = #{id} WHERE t.id = #{id}
</select> </select>
<select id="loadByGroupAndName" parameterType="java.util.HashMap" resultMap="XxlJobLog"> <select id="loadByGroupAndName" parameterType="java.util.HashMap" resultMap="XxlJobLog">
SELECT <include refid="Base_Column_List" /> SELECT <include refid="Base_Column_List" />
FROM xxl_job_qrtz_trigger_log AS t FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
WHERE t.job_group = #{jobGroup} WHERE t.job_group = #{jobGroup}
AND t.job_name = #{jobName} AND t.job_name = #{jobName}
</select> </select>
<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id" > <insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO `xxl_job_qrtz_trigger_log` ( INSERT INTO XXL_JOB_QRTZ_TRIGGER_LOG (
`job_group`, `job_group`,
`job_name`, `job_name`,
`job_cron`, `job_cron`,
...@@ -123,7 +123,7 @@ ...@@ -123,7 +123,7 @@
</insert> </insert>
<update id="updateTriggerInfo"> <update id="updateTriggerInfo">
UPDATE `xxl_job_qrtz_trigger_log` UPDATE XXL_JOB_QRTZ_TRIGGER_LOG
SET SET
`trigger_time`= #{triggerTime}, `trigger_time`= #{triggerTime},
`trigger_status`= #{triggerStatus}, `trigger_status`= #{triggerStatus},
...@@ -135,7 +135,7 @@ ...@@ -135,7 +135,7 @@
</update> </update>
<update id="updateHandleInfo"> <update id="updateHandleInfo">
UPDATE `xxl_job_qrtz_trigger_log` UPDATE XXL_JOB_QRTZ_TRIGGER_LOG
SET SET
`handle_time`= #{handleTime}, `handle_time`= #{handleTime},
`handle_status`= #{handleStatus}, `handle_status`= #{handleStatus},
...@@ -144,7 +144,7 @@ ...@@ -144,7 +144,7 @@
</update> </update>
<delete id="delete"> <delete id="delete">
delete from `xxl_job_qrtz_trigger_log` delete from XXL_JOB_QRTZ_TRIGGER_LOG
WHERE job_group = #{jobGroup} WHERE job_group = #{jobGroup}
AND job_name = #{jobName} AND job_name = #{jobName}
</delete> </delete>
......
...@@ -34,18 +34,21 @@ ...@@ -34,18 +34,21 @@
<div class="row"> <div class="row">
<div class="col-xs-3"> <div class="col-xs-3">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon">任务组</span> <span class="input-group-addon">分组</span>
<select class="form-control" id="jobGroup" > <select class="form-control" id="jobGroup" paramVal="${jobGroup}" >
<option value="" selected>请选择</option>
<#list JobGroupList as group> <#list JobGroupList as group>
<option value="${group}" <#if jobGroup == group>selected</#if> >${group.desc}</option> <option value="${group}" <#if jobGroup == group && false>selected</#if> >${group.desc}</option>
</#list> </#list>
</select> </select>
</div> </div>
</div> </div>
<div class="col-xs-3"> <div class="col-xs-3">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon">任务名</span> <span class="input-group-addon">名称</span>
<input type="text" class="form-control" id="jobName" value="${jobName}" autocomplete="on" > <select class="form-control" id="jobName" paramVal="${jobName}" >
<option value="" >请选择</option>
</select>
</div> </div>
</div> </div>
<div class="col-xs-4"> <div class="col-xs-4">
......
...@@ -6,10 +6,11 @@ $(function() { ...@@ -6,10 +6,11 @@ $(function() {
"serverSide": true, "serverSide": true,
"ajax": { "ajax": {
url: base_url + "/jobinfo/pageList", url: base_url + "/jobinfo/pageList",
type:"post",
data : function ( d ) { data : function ( d ) {
var obj = {}; var obj = {};
obj.jobGroup = $('#jobGroup').val(); obj.jobGroup = $('#jobGroup').val();
obj.jobName = $('#jobName').val(); obj.jobDesc = $('#jobDesc').val();
obj.start = d.start; obj.start = d.start;
obj.length = d.length; obj.length = d.length;
return obj; return obj;
...@@ -33,7 +34,7 @@ $(function() { ...@@ -33,7 +34,7 @@ $(function() {
return data; return data;
} }
}, },
{ "data": 'jobName'}, { "data": 'jobName', "visible" : false},
{ "data": 'jobDesc', "visible" : true}, { "data": 'jobDesc', "visible" : true},
{ "data": 'jobCron', "visible" : true}, { "data": 'jobCron', "visible" : true},
{ "data": 'jobClass', "visible" : false}, { "data": 'jobClass', "visible" : false},
...@@ -98,7 +99,6 @@ $(function() { ...@@ -98,7 +99,6 @@ $(function() {
' jobCron="'+ row.jobCron +'" '+ ' jobCron="'+ row.jobCron +'" '+
' jobDesc="'+ row.jobDesc +'" '+ ' jobDesc="'+ row.jobDesc +'" '+
' jobClass="'+ row.jobClass +'" '+ ' jobClass="'+ row.jobClass +'" '+
' jobData="'+ row.jobData +'" '+
' executorAddress="'+row.executorAddress +'" '+ ' executorAddress="'+row.executorAddress +'" '+
' executorHandler="'+ row.executorHandler +'" '+ ' executorHandler="'+ row.executorHandler +'" '+
' executorParam="'+ row.executorParam +'" '+ ' executorParam="'+ row.executorParam +'" '+
...@@ -214,77 +214,55 @@ $(function() { ...@@ -214,77 +214,55 @@ $(function() {
errorElement : 'span', errorElement : 'span',
errorClass : 'help-block', errorClass : 'help-block',
focusInvalid : true, focusInvalid : true,
rules : { rules : {
jobName : { jobDesc : {
required : true , required : true,
minlength: 4, maxlength: 50
maxlength: 100, },
myValid01:true jobCron : {
}, required : true
jobCron : {
required : true ,
maxlength: 100
},
jobDesc : {
required : true ,
maxlength: 200
}, },
executorAddress : { executorAddress : {
required : true , required : true
maxlength: 200
}, },
executorHandler : { executorHandler : {
required : true , required : true
maxlength: 200
},
author : {
required : true ,
maxlength: 200
}, },
alarmEmail : { alarmEmail : {
required : true , required : true
maxlength: 200
}, },
alarmThreshold : { alarmThreshold : {
required : true , required : true ,
digits:true digits:true
} },
author : {
required : true
}
}, },
messages : { messages : {
jobName : {
required :"请输入“任务名”" ,
minlength:"“任务名”长度不应低于4位",
maxlength:"“任务名”长度不应超过100位"
},
jobCron : {
required :"请输入“Cron”." ,
maxlength:"“Cron”长度不应超过100位"
},
jobDesc : { jobDesc : {
required :"请输入“任务描述”." , required :"请输入“名称”."
maxlength:"“任务描述”长度不应超过200位" },
}, jobCron : {
required :"请输入“Cron”."
},
executorAddress : { executorAddress : {
required :"请输入“执行器地址”." , required :"请输入“执行器地址”."
maxlength:"“执行器地址”长度不应超过200位"
}, },
executorHandler : { executorHandler : {
required : "请输入“jobHandler”." , required : "请输入“JobHandler”."
maxlength: "“jobHandler”长度不应超过200位"
},
author : {
required : "请输入“负责人”." ,
maxlength: "“负责人”长度不应超过50位"
}, },
alarmEmail : { alarmEmail : {
required : "请输入“报警邮件”." , required : "请输入“报警邮件”."
maxlength: "“报警邮件”长度不应超过200位"
}, },
alarmThreshold : { alarmThreshold : {
required : "请输入“报警阈值”." , required : "请输入“报警阈值”." ,
digits:"阀值应该为整数." digits:"阀值应该为整数."
},
author : {
required : "请输入“负责人”."
} }
}, },
highlight : function(element) { highlight : function(element) {
$(element).closest('.form-group').addClass('has-error'); $(element).closest('.form-group').addClass('has-error');
}, },
...@@ -348,10 +326,13 @@ $(function() { ...@@ -348,10 +326,13 @@ $(function() {
// 更新 // 更新
$("#job_list").on('click', '.update',function() { $("#job_list").on('click', '.update',function() {
// base data
$("#updateModal .form input[name='jobGroupTitle']").find("option[value='" + $(this).parent('p').attr("jobGroup") + "']").attr("selected",true);
$("#updateModal .form input[name='jobGroup']").val($(this).parent('p').attr("jobGroup")); $("#updateModal .form input[name='jobGroup']").val($(this).parent('p').attr("jobGroup"));
$("#updateModal .form input[name='jobName']").val($(this).parent('p').attr("jobName")); $("#updateModal .form input[name='jobName']").val($(this).parent('p').attr("jobName"));
$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
$("#updateModal .form input[name='jobDesc']").val($(this).parent('p').attr("jobDesc")); $("#updateModal .form input[name='jobDesc']").val($(this).parent('p').attr("jobDesc"));
$("#updateModal .form input[name='jobCron']").val($(this).parent('p').attr("jobCron"));
$("#updateModal .form input[name='executorAddress']").val($(this).parent('p').attr("executorAddress")); $("#updateModal .form input[name='executorAddress']").val($(this).parent('p').attr("executorAddress"));
$("#updateModal .form input[name='executorHandler']").val($(this).parent('p').attr("executorHandler")); $("#updateModal .form input[name='executorHandler']").val($(this).parent('p').attr("executorHandler"));
$("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam")); $("#updateModal .form input[name='executorParam']").val($(this).parent('p').attr("executorParam"));
...@@ -359,7 +340,7 @@ $(function() { ...@@ -359,7 +340,7 @@ $(function() {
$("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail")); $("#updateModal .form input[name='alarmEmail']").val($(this).parent('p').attr("alarmEmail"));
$("#updateModal .form input[name='alarmThreshold']").val($(this).parent('p').attr("alarmThreshold")); $("#updateModal .form input[name='alarmThreshold']").val($(this).parent('p').attr("alarmThreshold"));
$("#updateModal .form input[name='glueSwitch']").val($(this).parent('p').attr("glueSwitch")); $("#updateModal .form input[name='glueSwitch']").val($(this).parent('p').attr("glueSwitch"));
// GLUE check // GLUE check
var $glueSwitch = $("#updateModal .form input[name='glueSwitch']"); var $glueSwitch = $("#updateModal .form input[name='glueSwitch']");
var $executorHandler = $("#updateModal .form input[name='executorHandler']"); var $executorHandler = $("#updateModal .form input[name='executorHandler']");
...@@ -376,68 +357,58 @@ $(function() { ...@@ -376,68 +357,58 @@ $(function() {
var updateModalValidate = $("#updateModal .form").validate({ var updateModalValidate = $("#updateModal .form").validate({
errorElement : 'span', errorElement : 'span',
errorClass : 'help-block', errorClass : 'help-block',
focusInvalid : true, focusInvalid : true,
rules : {
jobCron : { rules : {
required : true , jobDesc : {
maxlength: 100 required : true,
}, maxlength: 50
jobDesc : { },
required : true , jobCron : {
maxlength: 200 required : true
}, },
executorAddress : { executorAddress : {
required : true , required : true
maxlength: 200 },
}, executorHandler : {
executorHandler : { required : true
required : true , },
maxlength: 200 alarmEmail : {
}, required : true
author : { },
required : true , alarmThreshold : {
maxlength: 200 required : true ,
}, digits:true
alarmEmail : { },
required : true , author : {
maxlength: 200 required : true
}, }
alarmThreshold : { },
required : true , messages : {
digits:true jobDesc : {
} required :"请输入“名称”."
}, },
messages : { jobCron : {
jobCron : { required :"请输入“Cron”."
required :"请输入“Cron”." , },
maxlength:"“Cron”长度不应超过100位" executorAddress : {
}, required :"请输入“执行器地址”."
jobDesc : { },
required :"请输入“任务描述”." , executorHandler : {
maxlength:"“任务描述”长度不应超过200位" required : "请输入“JobHandler”."
}, },
executorAddress : { alarmEmail : {
required :"请输入“执行器地址”." , required : "请输入“报警邮件”."
maxlength:"“执行器地址”长度不应超过200位" },
}, alarmThreshold : {
executorHandler : { required : "请输入“报警阈值”." ,
required : "请输入“jobHandler”." , digits:"阀值应该为整数."
maxlength: "“jobHandler”长度不应超过200位" },
}, author : {
author : { required : "请输入“负责人”."
required : "请输入“负责人”." , }
maxlength: "“负责人”长度不应超过50位" },
}, highlight : function(element) {
alarmEmail : {
required : "请输入“报警邮件”." ,
maxlength: "“报警邮件”长度不应超过200位"
},
alarmThreshold : {
required : "请输入“报警阈值”." ,
digits:"阀值应该为整数."
}
},
highlight : function(element) {
$(element).closest('.form-group').addClass('has-error'); $(element).closest('.form-group').addClass('has-error');
}, },
success : function(label) { success : function(label) {
......
$(function() { $(function() {
// 分组列表选中, 任务列表初始化和选中
var ifParam = true;
$("#jobGroup").on("change", function () {
var jobGroup = $(this).children('option:selected').val();
$.ajax({
type : 'POST',
async: false, // async, avoid js invoke pagelist before jobName data init
url : base_url + '/joblog/getJobsByGroup',
data : {"jobGroup":jobGroup},
dataType : "json",
success : function(data){
if (data.code == 200) {
$("#jobName").html('<option value="" >请选择</option>');
$.each(data.content, function (n, value) {
$("#jobName").append('<option value="' + value.jobName + '" >' + value.jobDesc + '</option>');
});
if ($("#jobName").attr("paramVal")){
$("#jobName").find("option[value='" + $("#jobName").attr("paramVal") + "']").attr("selected",true);
$("#jobName").attr("paramVal")
}
} else {
ComAlertTec.show(data.msg);
}
},
});
});
if ($("#jobGroup").attr("paramVal")){
$("#jobGroup").find("option[value='" + $("#jobGroup").attr("paramVal") + "']").attr("selected",true);
$("#jobGroup").change();
$("#jobGroup").attr("")
}
// 过滤时间 // 过滤时间
$('#filterTime').daterangepicker({ $('#filterTime').daterangepicker({
timePicker: true, //是否显示小时和分钟 timePicker: true, //是否显示小时和分钟
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
</appender> </appender>
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender"> <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="/logs/xxl-job-client-demo.log"/> <param name="file" value="/data/applogs/xxl-job/xxl-job-executor-example.log"/>
<param name="append" value="true"/> <param name="append" value="true"/>
<param name="encoding" value="UTF-8"/> <param name="encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout"> <layout class="org.apache.log4j.PatternLayout">
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
</appender> </appender>
<appender name="xxl-job" class="com.xxl.job.core.log.XxlJobFileAppender"> <appender name="xxl-job" class="com.xxl.job.core.log.XxlJobFileAppender">
<param name="filePath" value="/logs/xxl-job/"/> <param name="filePath" value="/data/applogs/xxl-job/jobhandler/"/>
<param name="append" value="true"/> <param name="append" value="true"/>
<param name="encoding" value="UTF-8"/> <param name="encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout"> <layout class="org.apache.log4j.PatternLayout">
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<select id="load" parameterType="java.util.HashMap" resultMap="XxlJobInfo"> <select id="load" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
SELECT <include refid="Base_Column_List" /> SELECT <include refid="Base_Column_List" />
FROM xxl_job_qrtz_trigger_info AS t FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
WHERE t.job_group = #{jobGroup} WHERE t.job_group = #{jobGroup}
AND t.job_name = #{jobName} AND t.job_name = #{jobName}
</select> </select>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论