xuxueli 7 лет назад
Родитель
Сommit
50b1c67943

+ 32 - 32
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java

@@ -1,33 +1,33 @@
-package com.xxl.job.admin.core.jobbean;
-
-import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.quartz.JobKey;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.scheduling.quartz.QuartzJobBean;
-
-/**
- * http job bean
- * “@DisallowConcurrentExecution” diable concurrent, thread size can not be only one, better given more
- * @author xuxueli 2015-12-17 18:20:34
- */
-//@DisallowConcurrentExecution
-public class RemoteHttpJobBean extends QuartzJobBean {
-	private static Logger logger = LoggerFactory.getLogger(RemoteHttpJobBean.class);
-
-	@Override
-	protected void executeInternal(JobExecutionContext context)
-			throws JobExecutionException {
-
-		// load jobId
-		JobKey jobKey = context.getTrigger().getJobKey();
-		Integer jobId = Integer.valueOf(jobKey.getName());
-
-		// trigger
-		//XxlJobTrigger.trigger(jobId);
-		JobTriggerPoolHelper.trigger(jobId, -1);
-	}
-
+package com.xxl.job.admin.core.jobbean;
+
+import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.quartz.JobKey;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+/**
+ * http job bean
+ * “@DisallowConcurrentExecution” diable concurrent, thread size can not be only one, better given more
+ * @author xuxueli 2015-12-17 18:20:34
+ */
+//@DisallowConcurrentExecution
+public class RemoteHttpJobBean extends QuartzJobBean {
+	private static Logger logger = LoggerFactory.getLogger(RemoteHttpJobBean.class);
+
+	@Override
+	protected void executeInternal(JobExecutionContext context)
+			throws JobExecutionException {
+
+		// load jobId
+		JobKey jobKey = context.getTrigger().getJobKey();
+		Integer jobId = Integer.valueOf(jobKey.getName());
+
+		// trigger
+		//XxlJobTrigger.trigger(jobId);
+		JobTriggerPoolHelper.trigger(jobId, -1);
+	}
+
 }

+ 155 - 155
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java

@@ -1,155 +1,155 @@
-package com.xxl.job.admin.core.model;
-
-import java.util.Date;
-
-/**
- * xxl-job log, used to track trigger process
- * @author xuxueli  2015-12-19 23:19:09
- */
-public class XxlJobLog {
-	
-	private int id;
-	
-	// job info
-	private int jobGroup;
-	private int jobId;
-
-	// glueType
-	private String glueType;
-
-	// execute info
-	private String executorAddress;
-	private String executorHandler;
-	private String executorParam;
-	private int executorFailRetryCount;
-	
-	// trigger info
-	private Date triggerTime;
-	private int triggerCode;
-	private String triggerMsg;
-	
-	// handle info
-	private Date handleTime;
-	private int handleCode;
-	private String handleMsg;
-
-	public int getId() {
-		return id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public int getJobGroup() {
-		return jobGroup;
-	}
-
-	public void setJobGroup(int jobGroup) {
-		this.jobGroup = jobGroup;
-	}
-
-	public int getJobId() {
-		return jobId;
-	}
-
-	public void setJobId(int jobId) {
-		this.jobId = jobId;
-	}
-
-	public String getGlueType() {
-		return glueType;
-	}
-
-	public void setGlueType(String glueType) {
-		this.glueType = glueType;
-	}
-
-	public String getExecutorAddress() {
-		return executorAddress;
-	}
-
-	public void setExecutorAddress(String executorAddress) {
-		this.executorAddress = executorAddress;
-	}
-
-	public String getExecutorHandler() {
-		return executorHandler;
-	}
-
-	public void setExecutorHandler(String executorHandler) {
-		this.executorHandler = executorHandler;
-	}
-
-	public String getExecutorParam() {
-		return executorParam;
-	}
-
-	public void setExecutorParam(String executorParam) {
-		this.executorParam = executorParam;
-	}
-
-	public int getExecutorFailRetryCount() {
-		return executorFailRetryCount;
-	}
-
-	public void setExecutorFailRetryCount(int executorFailRetryCount) {
-		this.executorFailRetryCount = executorFailRetryCount;
-	}
-
-	public Date getTriggerTime() {
-		return triggerTime;
-	}
-
-	public void setTriggerTime(Date triggerTime) {
-		this.triggerTime = triggerTime;
-	}
-
-	public int getTriggerCode() {
-		return triggerCode;
-	}
-
-	public void setTriggerCode(int triggerCode) {
-		this.triggerCode = triggerCode;
-	}
-
-	public String getTriggerMsg() {
-		return triggerMsg;
-	}
-
-	public void setTriggerMsg(String triggerMsg) {
-		// plugin
-		if (triggerMsg!=null && triggerMsg.length()>2000) {
-			triggerMsg = triggerMsg.substring(0, 2000);
-		}
-		this.triggerMsg = triggerMsg;
-	}
-
-	public Date getHandleTime() {
-		return handleTime;
-	}
-
-	public void setHandleTime(Date handleTime) {
-		this.handleTime = handleTime;
-	}
-
-	public int getHandleCode() {
-		return handleCode;
-	}
-
-	public void setHandleCode(int handleCode) {
-		this.handleCode = handleCode;
-	}
-
-	public String getHandleMsg() {
-		return handleMsg;
-	}
-
-	public void setHandleMsg(String handleMsg) {
-		// plugin
-		if (handleMsg!=null && handleMsg.length()>2000) {
-			handleMsg = handleMsg.substring(0, 2000);
-		}
-		this.handleMsg = handleMsg;
-	}
-}
+package com.xxl.job.admin.core.model;
+
+import java.util.Date;
+
+/**
+ * xxl-job log, used to track trigger process
+ * @author xuxueli  2015-12-19 23:19:09
+ */
+public class XxlJobLog {
+	
+	private int id;
+	
+	// job info
+	private int jobGroup;
+	private int jobId;
+
+	// glueType
+	private String glueType;
+
+	// execute info
+	private String executorAddress;
+	private String executorHandler;
+	private String executorParam;
+	private int executorFailRetryCount;
+	
+	// trigger info
+	private Date triggerTime;
+	private int triggerCode;
+	private String triggerMsg;
+	
+	// handle info
+	private Date handleTime;
+	private int handleCode;
+	private String handleMsg;
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public int getJobGroup() {
+		return jobGroup;
+	}
+
+	public void setJobGroup(int jobGroup) {
+		this.jobGroup = jobGroup;
+	}
+
+	public int getJobId() {
+		return jobId;
+	}
+
+	public void setJobId(int jobId) {
+		this.jobId = jobId;
+	}
+
+	public String getGlueType() {
+		return glueType;
+	}
+
+	public void setGlueType(String glueType) {
+		this.glueType = glueType;
+	}
+
+	public String getExecutorAddress() {
+		return executorAddress;
+	}
+
+	public void setExecutorAddress(String executorAddress) {
+		this.executorAddress = executorAddress;
+	}
+
+	public String getExecutorHandler() {
+		return executorHandler;
+	}
+
+	public void setExecutorHandler(String executorHandler) {
+		this.executorHandler = executorHandler;
+	}
+
+	public String getExecutorParam() {
+		return executorParam;
+	}
+
+	public void setExecutorParam(String executorParam) {
+		this.executorParam = executorParam;
+	}
+
+	public int getExecutorFailRetryCount() {
+		return executorFailRetryCount;
+	}
+
+	public void setExecutorFailRetryCount(int executorFailRetryCount) {
+		this.executorFailRetryCount = executorFailRetryCount;
+	}
+
+	public Date getTriggerTime() {
+		return triggerTime;
+	}
+
+	public void setTriggerTime(Date triggerTime) {
+		this.triggerTime = triggerTime;
+	}
+
+	public int getTriggerCode() {
+		return triggerCode;
+	}
+
+	public void setTriggerCode(int triggerCode) {
+		this.triggerCode = triggerCode;
+	}
+
+	public String getTriggerMsg() {
+		return triggerMsg;
+	}
+
+	public void setTriggerMsg(String triggerMsg) {
+		// plugin
+		if (triggerMsg!=null && triggerMsg.length()>2000) {
+			triggerMsg = triggerMsg.substring(0, 2000);
+		}
+		this.triggerMsg = triggerMsg;
+	}
+
+	public Date getHandleTime() {
+		return handleTime;
+	}
+
+	public void setHandleTime(Date handleTime) {
+		this.handleTime = handleTime;
+	}
+
+	public int getHandleCode() {
+		return handleCode;
+	}
+
+	public void setHandleCode(int handleCode) {
+		this.handleCode = handleCode;
+	}
+
+	public String getHandleMsg() {
+		return handleMsg;
+	}
+
+	public void setHandleMsg(String handleMsg) {
+		// plugin
+		if (handleMsg!=null && handleMsg.length()>2000) {
+			handleMsg = handleMsg.substring(0, 2000);
+		}
+		this.handleMsg = handleMsg;
+	}
+}

+ 216 - 216
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml

@@ -1,217 +1,217 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
-	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.xxl.job.admin.dao.XxlJobLogDao">
-	
-	<resultMap id="XxlJobLog" type="com.xxl.job.admin.core.model.XxlJobLog" >
-		<result column="id" property="id" />
-
-		<result column="job_group" property="jobGroup" />
-		<result column="job_id" property="jobId" />
-
-		<result column="glue_type" property="glueType" />
-
-		<result column="executor_address" property="executorAddress" />
-		<result column="executor_handler" property="executorHandler" />
-	    <result column="executor_param" property="executorParam" />
-		<result column="executor_fail_retry_count" property="executorFailRetryCount" />
-	    
-	    <result column="trigger_time" property="triggerTime" />
-	    <result column="trigger_code" property="triggerCode" />
-	    <result column="trigger_msg" property="triggerMsg" />
-	    
-	    <result column="handle_time" property="handleTime" />
-	    <result column="handle_code" property="handleCode" />
-	    <result column="handle_msg" property="handleMsg" />
-	    
-	</resultMap>
-
-	<sql id="Base_Column_List">
-		t.id,
-		t.job_group,
-		t.job_id,
-		t.glue_type,
-		t.executor_address,
-		t.executor_handler,
-		t.executor_param,
-		t.executor_fail_retry_count,
-		t.trigger_time,
-		t.trigger_code,
-		t.trigger_msg,
-		t.handle_time,
-		t.handle_code,
-		t.handle_msg
-	</sql>
-	
-	<select id="pageList" resultMap="XxlJobLog">
-		SELECT <include refid="Base_Column_List" />
-		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
-		<trim prefix="WHERE" prefixOverrides="AND | OR" >
-			<if test="jobGroup gt 0">
-				AND t.job_group = #{jobGroup}
-			</if>
-			<if test="jobId gt 0">
-				AND t.job_id = #{jobId}
-			</if>
-			<if test="triggerTimeStart != null">
-				AND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}
-			</if>
-			<if test="triggerTimeEnd != null">
-				AND t.trigger_time <![CDATA[ <= ]]> #{triggerTimeEnd}
-			</if>
-			<if test="logStatus == 1" >
-				AND t.handle_code = 200
-			</if>
-			<if test="logStatus == 2" >
-				AND (
-					t.trigger_code NOT IN (0, 200) OR
-					t.handle_code NOT IN (0, 200)
-				)
-			</if>
-			<if test="logStatus == 3" >
-				AND t.trigger_code = 200
-				AND t.handle_code = 0
-			</if>
-		</trim>
-		ORDER BY id DESC
-		LIMIT #{offset}, #{pagesize}
-	</select>
-	
-	<select id="pageListCount" resultType="int">
-		SELECT count(1)
-		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
-		<trim prefix="WHERE" prefixOverrides="AND | OR" >
-			<if test="jobGroup gt 0">
-				AND t.job_group = #{jobGroup}
-			</if>
-			<if test="jobId gt 0">
-				AND t.job_id = #{jobId}
-			</if>
-			<if test="triggerTimeStart != null">
-				AND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}
-			</if>
-			<if test="triggerTimeEnd != null">
-				AND t.trigger_time <![CDATA[ <= ]]> #{triggerTimeEnd}
-			</if>
-			<if test="logStatus == 1" >
-				AND t.handle_code = 200
-			</if>
-			<if test="logStatus == 2" >
-				AND (
-					t.trigger_code NOT IN (0, 200) OR
-					t.handle_code NOT IN (0, 200)
-				)
-			</if>
-			<if test="logStatus == 3" >
-				AND t.trigger_code = 200
-				AND t.handle_code = 0
-			</if>
-		</trim>
-	</select>
-	
-	<select id="load" parameterType="java.lang.Integer" resultMap="XxlJobLog">
-		SELECT <include refid="Base_Column_List" />
-		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
-		WHERE t.id = #{id}
-	</select>
-
-	
-	<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id" >
-		INSERT INTO XXL_JOB_QRTZ_TRIGGER_LOG (
-			`job_group`,
-			`job_id`,
-			`trigger_code`,
-			`handle_code`
-		) VALUES (
-			#{jobGroup},
-			#{jobId},
-			#{triggerCode},
-			#{handleCode}
-		);
-		<!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
-			SELECT LAST_INSERT_ID() 
-		</selectKey>-->
-	</insert>
-
-	<update id="updateTriggerInfo" >
-		UPDATE XXL_JOB_QRTZ_TRIGGER_LOG
-		SET
-		    `glue_type`= #{glueType},
-			`trigger_time`= #{triggerTime},
-			`trigger_code`= #{triggerCode},
-			`trigger_msg`= #{triggerMsg},
-			`executor_address`= #{executorAddress},
-			`executor_handler`=#{executorHandler},
-			`executor_param`= #{executorParam},
-			`executor_fail_retry_count`= #{executorFailRetryCount}
-		WHERE `id`= #{id}
-	</update>
-
-	<update id="updateHandleInfo">
-		UPDATE XXL_JOB_QRTZ_TRIGGER_LOG
-		SET 
-			`handle_time`= #{handleTime}, 
-			`handle_code`= #{handleCode},
-			`handle_msg`= #{handleMsg} 
-		WHERE `id`= #{id}
-	</update>
-	
-	<delete id="delete" >
-		delete from XXL_JOB_QRTZ_TRIGGER_LOG
-		WHERE job_id = #{jobId}
-	</delete>
-
-	<select id="triggerCountByHandleCode" resultType="int" >
-		SELECT count(1)
-		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
-		<trim prefix="WHERE" prefixOverrides="AND | OR" >
-			<if test="handleCode gt 0">
-				AND t.handle_code = #{handleCode}
-			</if>
-		</trim>
-	</select>
-
-    <select id="triggerCountByDay" resultType="java.util.Map" >
-		SELECT
-			DATE_FORMAT(trigger_time,'%Y-%m-%d') triggerDay,
-			COUNT(handle_code) triggerDayCount,
-			SUM(CASE WHEN (trigger_code = 200 and handle_code = 0) then 1 else 0 end) as triggerDayCountRunning,
-			SUM(CASE WHEN handle_code = 200 then 1 else 0 end) as triggerDayCountSuc
-		FROM XXL_JOB_QRTZ_TRIGGER_LOG
-		WHERE trigger_time BETWEEN #{from} and #{to}
-		GROUP BY triggerDay;
-    </select>
-
-	<delete id="clearLog" >
-		delete from XXL_JOB_QRTZ_TRIGGER_LOG
-		<trim prefix="WHERE" prefixOverrides="AND | OR" >
-			<if test="jobGroup gt 0">
-				AND job_group = #{jobGroup}
-			</if>
-			<if test="jobId gt 0">
-				AND job_id = #{jobId}
-			</if>
-			<if test="clearBeforeTime != null">
-				AND trigger_time <![CDATA[ <= ]]> #{clearBeforeTime}
-			</if>
-			<if test="clearBeforeNum gt 0">
-				AND id NOT in(
-					SELECT id FROM(
-						SELECT id FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
-						<trim prefix="WHERE" prefixOverrides="AND | OR" >
-							<if test="jobGroup gt 0">
-								AND t.job_group = #{jobGroup}
-							</if>
-							<if test="jobId gt 0">
-								AND t.job_id = #{jobId}
-							</if>
-						</trim>
-						ORDER BY t.trigger_time desc
-						LIMIT 0, #{clearBeforeNum}
-					) t1
-				)
-			</if>
-		</trim>
-	</delete>
-	
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xxl.job.admin.dao.XxlJobLogDao">
+	
+	<resultMap id="XxlJobLog" type="com.xxl.job.admin.core.model.XxlJobLog" >
+		<result column="id" property="id" />
+
+		<result column="job_group" property="jobGroup" />
+		<result column="job_id" property="jobId" />
+
+		<result column="glue_type" property="glueType" />
+
+		<result column="executor_address" property="executorAddress" />
+		<result column="executor_handler" property="executorHandler" />
+	    <result column="executor_param" property="executorParam" />
+		<result column="executor_fail_retry_count" property="executorFailRetryCount" />
+	    
+	    <result column="trigger_time" property="triggerTime" />
+	    <result column="trigger_code" property="triggerCode" />
+	    <result column="trigger_msg" property="triggerMsg" />
+	    
+	    <result column="handle_time" property="handleTime" />
+	    <result column="handle_code" property="handleCode" />
+	    <result column="handle_msg" property="handleMsg" />
+	    
+	</resultMap>
+
+	<sql id="Base_Column_List">
+		t.id,
+		t.job_group,
+		t.job_id,
+		t.glue_type,
+		t.executor_address,
+		t.executor_handler,
+		t.executor_param,
+		t.executor_fail_retry_count,
+		t.trigger_time,
+		t.trigger_code,
+		t.trigger_msg,
+		t.handle_time,
+		t.handle_code,
+		t.handle_msg
+	</sql>
+	
+	<select id="pageList" resultMap="XxlJobLog">
+		SELECT <include refid="Base_Column_List" />
+		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
+		<trim prefix="WHERE" prefixOverrides="AND | OR" >
+			<if test="jobGroup gt 0">
+				AND t.job_group = #{jobGroup}
+			</if>
+			<if test="jobId gt 0">
+				AND t.job_id = #{jobId}
+			</if>
+			<if test="triggerTimeStart != null">
+				AND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}
+			</if>
+			<if test="triggerTimeEnd != null">
+				AND t.trigger_time <![CDATA[ <= ]]> #{triggerTimeEnd}
+			</if>
+			<if test="logStatus == 1" >
+				AND t.handle_code = 200
+			</if>
+			<if test="logStatus == 2" >
+				AND (
+					t.trigger_code NOT IN (0, 200) OR
+					t.handle_code NOT IN (0, 200)
+				)
+			</if>
+			<if test="logStatus == 3" >
+				AND t.trigger_code = 200
+				AND t.handle_code = 0
+			</if>
+		</trim>
+		ORDER BY id DESC
+		LIMIT #{offset}, #{pagesize}
+	</select>
+	
+	<select id="pageListCount" resultType="int">
+		SELECT count(1)
+		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
+		<trim prefix="WHERE" prefixOverrides="AND | OR" >
+			<if test="jobGroup gt 0">
+				AND t.job_group = #{jobGroup}
+			</if>
+			<if test="jobId gt 0">
+				AND t.job_id = #{jobId}
+			</if>
+			<if test="triggerTimeStart != null">
+				AND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}
+			</if>
+			<if test="triggerTimeEnd != null">
+				AND t.trigger_time <![CDATA[ <= ]]> #{triggerTimeEnd}
+			</if>
+			<if test="logStatus == 1" >
+				AND t.handle_code = 200
+			</if>
+			<if test="logStatus == 2" >
+				AND (
+					t.trigger_code NOT IN (0, 200) OR
+					t.handle_code NOT IN (0, 200)
+				)
+			</if>
+			<if test="logStatus == 3" >
+				AND t.trigger_code = 200
+				AND t.handle_code = 0
+			</if>
+		</trim>
+	</select>
+	
+	<select id="load" parameterType="java.lang.Integer" resultMap="XxlJobLog">
+		SELECT <include refid="Base_Column_List" />
+		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
+		WHERE t.id = #{id}
+	</select>
+
+	
+	<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id" >
+		INSERT INTO XXL_JOB_QRTZ_TRIGGER_LOG (
+			`job_group`,
+			`job_id`,
+			`trigger_code`,
+			`handle_code`
+		) VALUES (
+			#{jobGroup},
+			#{jobId},
+			#{triggerCode},
+			#{handleCode}
+		);
+		<!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
+			SELECT LAST_INSERT_ID() 
+		</selectKey>-->
+	</insert>
+
+	<update id="updateTriggerInfo" >
+		UPDATE XXL_JOB_QRTZ_TRIGGER_LOG
+		SET
+		    `glue_type`= #{glueType},
+			`trigger_time`= #{triggerTime},
+			`trigger_code`= #{triggerCode},
+			`trigger_msg`= #{triggerMsg},
+			`executor_address`= #{executorAddress},
+			`executor_handler`=#{executorHandler},
+			`executor_param`= #{executorParam},
+			`executor_fail_retry_count`= #{executorFailRetryCount}
+		WHERE `id`= #{id}
+	</update>
+
+	<update id="updateHandleInfo">
+		UPDATE XXL_JOB_QRTZ_TRIGGER_LOG
+		SET 
+			`handle_time`= #{handleTime}, 
+			`handle_code`= #{handleCode},
+			`handle_msg`= #{handleMsg} 
+		WHERE `id`= #{id}
+	</update>
+	
+	<delete id="delete" >
+		delete from XXL_JOB_QRTZ_TRIGGER_LOG
+		WHERE job_id = #{jobId}
+	</delete>
+
+	<select id="triggerCountByHandleCode" resultType="int" >
+		SELECT count(1)
+		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
+		<trim prefix="WHERE" prefixOverrides="AND | OR" >
+			<if test="handleCode gt 0">
+				AND t.handle_code = #{handleCode}
+			</if>
+		</trim>
+	</select>
+
+    <select id="triggerCountByDay" resultType="java.util.Map" >
+		SELECT
+			DATE_FORMAT(trigger_time,'%Y-%m-%d') triggerDay,
+			COUNT(handle_code) triggerDayCount,
+			SUM(CASE WHEN (trigger_code = 200 and handle_code = 0) then 1 else 0 end) as triggerDayCountRunning,
+			SUM(CASE WHEN handle_code = 200 then 1 else 0 end) as triggerDayCountSuc
+		FROM XXL_JOB_QRTZ_TRIGGER_LOG
+		WHERE trigger_time BETWEEN #{from} and #{to}
+		GROUP BY triggerDay;
+    </select>
+
+	<delete id="clearLog" >
+		delete from XXL_JOB_QRTZ_TRIGGER_LOG
+		<trim prefix="WHERE" prefixOverrides="AND | OR" >
+			<if test="jobGroup gt 0">
+				AND job_group = #{jobGroup}
+			</if>
+			<if test="jobId gt 0">
+				AND job_id = #{jobId}
+			</if>
+			<if test="clearBeforeTime != null">
+				AND trigger_time <![CDATA[ <= ]]> #{clearBeforeTime}
+			</if>
+			<if test="clearBeforeNum gt 0">
+				AND id NOT in(
+					SELECT id FROM(
+						SELECT id FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
+						<trim prefix="WHERE" prefixOverrides="AND | OR" >
+							<if test="jobGroup gt 0">
+								AND t.job_group = #{jobGroup}
+							</if>
+							<if test="jobId gt 0">
+								AND t.job_id = #{jobId}
+							</if>
+						</trim>
+						ORDER BY t.trigger_time desc
+						LIMIT 0, #{clearBeforeNum}
+					) t1
+				)
+			</if>
+		</trim>
+	</delete>
+	
 </mapper>

+ 367 - 367
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js

@@ -1,367 +1,367 @@
-$(function() {
-
-	// jobGroup change, job list init and select
-	$("#jobGroup").on("change", function () {
-		var jobGroup = $(this).children('option:selected').val();
-		$.ajax({
-			type : 'POST',
-            async: false,   // async, avoid js invoke pagelist before jobId data init
-			url : base_url + '/joblog/getJobsByGroup',
-			data : {"jobGroup":jobGroup},
-			dataType : "json",
-			success : function(data){
-				if (data.code == 200) {
-					$("#jobId").html( '<option value="0" >'+ I18n.system_all +'</option>' );
-					$.each(data.content, function (n, value) {
-                        $("#jobId").append('<option value="' + value.id + '" >' + value.jobDesc + '</option>');
-                    });
-                    if ($("#jobId").attr("paramVal")){
-                        $("#jobId").find("option[value='" + $("#jobId").attr("paramVal") + "']").attr("selected",true);
-                    }
-				} else {
-					layer.open({
-						title: I18n.system_tips ,
-                        btn: [ I18n.system_ok ],
-						content: (data.msg || I18n.system_api_error ),
-						icon: '2'
-					});
-				}
-			},
-		});
-	});
-	if ($("#jobGroup").attr("paramVal")){
-		$("#jobGroup").find("option[value='" + $("#jobGroup").attr("paramVal") + "']").attr("selected",true);
-        $("#jobGroup").change();
-	}
-
-	// filter Time
-    var rangesConf = {};
-    rangesConf[I18n.daterangepicker_ranges_recent_hour] = [moment().subtract(1, 'hours'), moment()];
-    rangesConf[I18n.daterangepicker_ranges_today] = [moment().startOf('day'), moment().endOf('day')];
-    rangesConf[I18n.daterangepicker_ranges_yesterday] = [moment().subtract(1, 'days').startOf('day'), moment().subtract(1, 'days').endOf('day')];
-    rangesConf[I18n.daterangepicker_ranges_this_month] = [moment().startOf('month'), moment().endOf('month')];
-    rangesConf[I18n.daterangepicker_ranges_last_month] = [moment().subtract(1, 'months').startOf('month'), moment().subtract(1, 'months').endOf('month')];
-    rangesConf[I18n.daterangepicker_ranges_recent_week] = [moment().subtract(1, 'weeks').startOf('day'), moment().endOf('day')];
-    rangesConf[I18n.daterangepicker_ranges_recent_month] = [moment().subtract(1, 'months').startOf('day'), moment().endOf('day')];
-
-	$('#filterTime').daterangepicker({
-        autoApply:false,
-        singleDatePicker:false,
-        showDropdowns:false,        // 是否显示年月选择条件
-		timePicker: true, 			// 是否显示小时和分钟选择条件
-		timePickerIncrement: 10, 	// 时间的增量,单位为分钟
-        timePicker24Hour : true,
-        opens : 'left', //日期选择框的弹出位置
-		ranges: rangesConf,
-        locale : {
-            format: 'YYYY-MM-DD HH:mm:ss',
-            separator : ' - ',
-            customRangeLabel : I18n.daterangepicker_custom_name ,
-            applyLabel : I18n.system_ok ,
-            cancelLabel : I18n.system_cancel ,
-            fromLabel : I18n.daterangepicker_custom_starttime ,
-            toLabel : I18n.daterangepicker_custom_endtime ,
-            daysOfWeek : I18n.daterangepicker_custom_daysofweek.split(',') ,        // '日', '一', '二', '三', '四', '五', '六'
-            monthNames : I18n.daterangepicker_custom_monthnames.split(',') ,        // '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'
-            firstDay : 1
-        },
-        startDate: rangesConf[I18n.daterangepicker_ranges_today][0],
-        endDate: rangesConf[I18n.daterangepicker_ranges_today][1]
-	});
-
-	// init date tables
-	var logTable = $("#joblog_list").dataTable({
-		"deferRender": true,
-		"processing" : true, 
-	    "serverSide": true,
-		"ajax": {
-	        url: base_url + "/joblog/pageList" ,
-            type:"post",
-	        data : function ( d ) {
-	        	var obj = {};
-	        	obj.jobGroup = $('#jobGroup').val();
-	        	obj.jobId = $('#jobId').val();
-                obj.logStatus = $('#logStatus').val();
-				obj.filterTime = $('#filterTime').val();
-	        	obj.start = d.start;
-	        	obj.length = d.length;
-                return obj;
-            }
-	    },
-	    "searching": false,
-	    "ordering": false,
-	    //"scrollX": false,
-	    "columns": [
-					{
-						"data": 'jobId',
-						"visible" : true,
-                        "width":'10%',
-						"render": function ( data, type, row ) {
-
-                            var glueTypeTitle = GlueTypeEnum[row.glueType];
-                            if (row.executorHandler) {
-                                glueTypeTitle = glueTypeTitle +":" + row.executorHandler;
-                            }
-
-							var temp = '';
-							temp += I18n.joblog_field_executorAddress + ':' + (row.executorAddress?row.executorAddress:'');
-							temp += '<br>'+ I18n.jobinfo_field_gluetype +':' + glueTypeTitle;
-							temp += '<br>'+ I18n.jobinfo_field_executorparam +':' + row.executorParam;
-
-							return '<a class="logTips" href="javascript:;" >'+ row.jobId +'<span style="display:none;">'+ temp +'</span></a>';
-						}
-					},
-					{ "data": 'jobGroup', "visible" : false},
-					{
-						"data": 'triggerTime',
-                        "width":'16%',
-						"render": function ( data, type, row ) {
-							return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
-						}
-					},
-					{
-						"data": 'triggerCode',
-                        "width":'12%',
-						"render": function ( data, type, row ) {
-							var html = data;
-							if (data == 200) {
-								html = '<span style="color: green">'+ I18n.system_success +'</span>';
-							} else if (data == 500) {
-								html = '<span style="color: red">'+ I18n.system_fail +'</span>';
-							} else if (data == 0) {
-                                html = '';
-							}
-                            return html;
-						}
-					},
-					{
-						"data": 'triggerMsg',
-                        "width":'12%',
-						"render": function ( data, type, row ) {
-							return data?'<a class="logTips" href="javascript:;" >'+ I18n.system_show +'<span style="display:none;">'+ data +'</span></a>':I18n.system_empty;
-						}
-					},
-	                { 
-	                	"data": 'handleTime',
-                        "width":'16%',
-	                	"render": function ( data, type, row ) {
-	                		return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
-	                	}
-	                },
-	                {
-						"data": 'handleCode',
-                        "width":'12%',
-						"render": function ( data, type, row ) {
-                            var html = data;
-                            if (data == 200) {
-                                html = '<span style="color: green">'+ I18n.joblog_handleCode_200 +'</span>';
-                            } else if (data == 500) {
-                                html = '<span style="color: red">'+ I18n.joblog_handleCode_500 +'</span>';
-                            } else if (data == 502) {
-                                html = '<span style="color: red">'+ I18n.joblog_handleCode_502 +'</span>';
-                            } else if (data == 0) {
-                                html = '';
-                            }
-                            return html;
-						}
-	                },
-	                { 
-	                	"data": 'handleMsg',
-                        "width":'12%',
-	                	"render": function ( data, type, row ) {
-	                		return data?'<a class="logTips" href="javascript:;" >'+ I18n.system_show +'<span style="display:none;">'+ data +'</span></a>':I18n.system_empty;
-	                	}
-	                },
-	                {
-						"data": 'handleMsg' ,
-						"bSortable": false,
-                        "width":'10%',
-	                	"render": function ( data, type, row ) {
-	                		// better support expression or string, not function
-	                		return function () {
-		                		if (row.triggerCode == 200){
-		                			var temp = '<a href="javascript:;" class="logDetail" _id="'+ row.id +'">'+ I18n.joblog_rolling_log +'</a>';
-		                			if(row.handleCode == 0){
-		                				temp += '<br><a href="javascript:;" class="logKill" _id="'+ row.id +'" style="color: red;" >'+ I18n.joblog_kill_log +'</a>';
-		                			}
-		                			return temp;
-		                		}
-		                		return null;	
-	                		}
-	                	}
-	                }
-	            ],
-        "language" : {
-            "sProcessing" : I18n.dataTable_sProcessing ,
-            "sLengthMenu" : I18n.dataTable_sLengthMenu ,
-            "sZeroRecords" : I18n.dataTable_sZeroRecords ,
-            "sInfo" : I18n.dataTable_sInfo ,
-            "sInfoEmpty" : I18n.dataTable_sInfoEmpty ,
-            "sInfoFiltered" : I18n.dataTable_sInfoFiltered ,
-            "sInfoPostFix" : "",
-            "sSearch" : I18n.dataTable_sSearch ,
-            "sUrl" : "",
-            "sEmptyTable" : I18n.dataTable_sEmptyTable ,
-            "sLoadingRecords" : I18n.dataTable_sLoadingRecords ,
-            "sInfoThousands" : ",",
-            "oPaginate" : {
-                "sFirst" : I18n.dataTable_sFirst ,
-                "sPrevious" : I18n.dataTable_sPrevious ,
-                "sNext" : I18n.dataTable_sNext ,
-                "sLast" : I18n.dataTable_sLast
-            },
-            "oAria" : {
-                "sSortAscending" : I18n.dataTable_sSortAscending ,
-                "sSortDescending" : I18n.dataTable_sSortDescending
-            }
-        }
-	});
-	
-	// logTips alert
-	$('#joblog_list').on('click', '.logTips', function(){
-		var msg = $(this).find('span').html();
-		ComAlertTec.show(msg);
-	});
-	
-	// search Btn
-	$('#searchBtn').on('click', function(){
-		logTable.fnDraw();
-	});
-	
-	// logDetail look
-	$('#joblog_list').on('click', '.logDetail', function(){
-		var _id = $(this).attr('_id');
-		
-		window.open(base_url + '/joblog/logDetailPage?id=' + _id);
-		return;
-	});
-
-	/**
-	 * log Kill
-	 */
-	$('#joblog_list').on('click', '.logKill', function(){
-		var _id = $(this).attr('_id');
-
-        layer.confirm( (I18n.system_ok + I18n.joblog_kill_log + '?'), {
-        	icon: 3,
-			title: I18n.system_tips ,
-            btn: [ I18n.system_ok, I18n.system_cancel ]
-		}, function(index){
-            layer.close(index);
-
-            $.ajax({
-                type : 'POST',
-                url : base_url + '/joblog/logKill',
-                data : {"id":_id},
-                dataType : "json",
-                success : function(data){
-                    if (data.code == 200) {
-                        layer.open({
-                            title: I18n.system_tips,
-                            btn: [ I18n.system_ok ],
-                            content: I18n.system_opt_suc ,
-                            icon: '1',
-                            end: function(layero, index){
-                                logTable.fnDraw();
-                            }
-                        });
-                    } else {
-                        layer.open({
-                            title: I18n.system_tips,
-                            btn: [ I18n.system_ok ],
-                            content: (data.msg || I18n.system_opt_fail ),
-                            icon: '2'
-                        });
-                    }
-                },
-            });
-        });
-
-	});
-
-	/**
-	 * clear Log
-	 */
-	$('#clearLog').on('click', function(){
-
-		var jobGroup = $('#jobGroup').val();
-		var jobId = $('#jobId').val();
-
-		var jobGroupText = $("#jobGroup").find("option:selected").text();
-		var jobIdText = $("#jobId").find("option:selected").text();
-
-		$('#clearLogModal input[name=jobGroup]').val(jobGroup);
-		$('#clearLogModal input[name=jobId]').val(jobId);
-
-		$('#clearLogModal .jobGroupText').val(jobGroupText);
-		$('#clearLogModal .jobIdText').val(jobIdText);
-
-		$('#clearLogModal').modal('show');
-
-	});
-	$("#clearLogModal .ok").on('click', function(){
-		$.post(base_url + "/joblog/clearLog",  $("#clearLogModal .form").serialize(), function(data, status) {
-			if (data.code == "200") {
-				$('#clearLogModal').modal('hide');
-				layer.open({
-					title: I18n.system_tips ,
-                    btn: [ I18n.system_ok ],
-					content: (I18n.joblog_clean_log + I18n.system_success) ,
-					icon: '1',
-					end: function(layero, index){
-						logTable.fnDraw();
-					}
-				});
-			} else {
-				layer.open({
-					title: I18n.system_tips ,
-                    btn: [ I18n.system_ok ],
-					content: (data.msg || (I18n.joblog_clean_log + I18n.system_fail) ),
-					icon: '2'
-				});
-			}
-		});
-	});
-	$("#clearLogModal").on('hide.bs.modal', function () {
-		$("#clearLogModal .form")[0].reset();
-	});
-
-});
-
-
-// Com Alert by Tec theme
-var ComAlertTec = {
-	html:function(){
-		var html =
-			'<div class="modal fade" id="ComAlertTec" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">' +
-			'<div class="modal-dialog">' +
-			'<div class="modal-content-tec">' +
-			'<div class="modal-body"><div class="alert" style="color:#fff;"></div></div>' +
-			'<div class="modal-footer">' +
-			'<div class="text-center" >' +
-			'<button type="button" class="btn btn-info ok" data-dismiss="modal" >'+ I18n.system_ok +'</button>' +
-			'</div>' +
-			'</div>' +
-			'</div>' +
-			'</div>' +
-			'</div>';
-		return html;
-	},
-	show:function(msg, callback){
-		// dom init
-		if ($('#ComAlertTec').length == 0){
-			$('body').append(ComAlertTec.html());
-		}
-
-		// init com alert
-		$('#ComAlertTec .alert').html(msg);
-		$('#ComAlertTec').modal('show');
-
-		$('#ComAlertTec .ok').click(function(){
-			$('#ComAlertTec').modal('hide');
-			if(typeof callback == 'function') {
-				callback();
-			}
-		});
-	}
-};
+$(function() {
+
+	// jobGroup change, job list init and select
+	$("#jobGroup").on("change", function () {
+		var jobGroup = $(this).children('option:selected').val();
+		$.ajax({
+			type : 'POST',
+            async: false,   // async, avoid js invoke pagelist before jobId data init
+			url : base_url + '/joblog/getJobsByGroup',
+			data : {"jobGroup":jobGroup},
+			dataType : "json",
+			success : function(data){
+				if (data.code == 200) {
+					$("#jobId").html( '<option value="0" >'+ I18n.system_all +'</option>' );
+					$.each(data.content, function (n, value) {
+                        $("#jobId").append('<option value="' + value.id + '" >' + value.jobDesc + '</option>');
+                    });
+                    if ($("#jobId").attr("paramVal")){
+                        $("#jobId").find("option[value='" + $("#jobId").attr("paramVal") + "']").attr("selected",true);
+                    }
+				} else {
+					layer.open({
+						title: I18n.system_tips ,
+                        btn: [ I18n.system_ok ],
+						content: (data.msg || I18n.system_api_error ),
+						icon: '2'
+					});
+				}
+			},
+		});
+	});
+	if ($("#jobGroup").attr("paramVal")){
+		$("#jobGroup").find("option[value='" + $("#jobGroup").attr("paramVal") + "']").attr("selected",true);
+        $("#jobGroup").change();
+	}
+
+	// filter Time
+    var rangesConf = {};
+    rangesConf[I18n.daterangepicker_ranges_recent_hour] = [moment().subtract(1, 'hours'), moment()];
+    rangesConf[I18n.daterangepicker_ranges_today] = [moment().startOf('day'), moment().endOf('day')];
+    rangesConf[I18n.daterangepicker_ranges_yesterday] = [moment().subtract(1, 'days').startOf('day'), moment().subtract(1, 'days').endOf('day')];
+    rangesConf[I18n.daterangepicker_ranges_this_month] = [moment().startOf('month'), moment().endOf('month')];
+    rangesConf[I18n.daterangepicker_ranges_last_month] = [moment().subtract(1, 'months').startOf('month'), moment().subtract(1, 'months').endOf('month')];
+    rangesConf[I18n.daterangepicker_ranges_recent_week] = [moment().subtract(1, 'weeks').startOf('day'), moment().endOf('day')];
+    rangesConf[I18n.daterangepicker_ranges_recent_month] = [moment().subtract(1, 'months').startOf('day'), moment().endOf('day')];
+
+	$('#filterTime').daterangepicker({
+        autoApply:false,
+        singleDatePicker:false,
+        showDropdowns:false,        // 是否显示年月选择条件
+		timePicker: true, 			// 是否显示小时和分钟选择条件
+		timePickerIncrement: 10, 	// 时间的增量,单位为分钟
+        timePicker24Hour : true,
+        opens : 'left', //日期选择框的弹出位置
+		ranges: rangesConf,
+        locale : {
+            format: 'YYYY-MM-DD HH:mm:ss',
+            separator : ' - ',
+            customRangeLabel : I18n.daterangepicker_custom_name ,
+            applyLabel : I18n.system_ok ,
+            cancelLabel : I18n.system_cancel ,
+            fromLabel : I18n.daterangepicker_custom_starttime ,
+            toLabel : I18n.daterangepicker_custom_endtime ,
+            daysOfWeek : I18n.daterangepicker_custom_daysofweek.split(',') ,        // '日', '一', '二', '三', '四', '五', '六'
+            monthNames : I18n.daterangepicker_custom_monthnames.split(',') ,        // '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'
+            firstDay : 1
+        },
+        startDate: rangesConf[I18n.daterangepicker_ranges_today][0],
+        endDate: rangesConf[I18n.daterangepicker_ranges_today][1]
+	});
+
+	// init date tables
+	var logTable = $("#joblog_list").dataTable({
+		"deferRender": true,
+		"processing" : true, 
+	    "serverSide": true,
+		"ajax": {
+	        url: base_url + "/joblog/pageList" ,
+            type:"post",
+	        data : function ( d ) {
+	        	var obj = {};
+	        	obj.jobGroup = $('#jobGroup').val();
+	        	obj.jobId = $('#jobId').val();
+                obj.logStatus = $('#logStatus').val();
+				obj.filterTime = $('#filterTime').val();
+	        	obj.start = d.start;
+	        	obj.length = d.length;
+                return obj;
+            }
+	    },
+	    "searching": false,
+	    "ordering": false,
+	    //"scrollX": false,
+	    "columns": [
+					{
+						"data": 'jobId',
+						"visible" : true,
+                        "width":'10%',
+						"render": function ( data, type, row ) {
+
+                            var glueTypeTitle = GlueTypeEnum[row.glueType];
+                            if (row.executorHandler) {
+                                glueTypeTitle = glueTypeTitle +":" + row.executorHandler;
+                            }
+
+							var temp = '';
+							temp += I18n.joblog_field_executorAddress + ':' + (row.executorAddress?row.executorAddress:'');
+							temp += '<br>'+ I18n.jobinfo_field_gluetype +':' + glueTypeTitle;
+							temp += '<br>'+ I18n.jobinfo_field_executorparam +':' + row.executorParam;
+
+							return '<a class="logTips" href="javascript:;" >'+ row.jobId +'<span style="display:none;">'+ temp +'</span></a>';
+						}
+					},
+					{ "data": 'jobGroup', "visible" : false},
+					{
+						"data": 'triggerTime',
+                        "width":'16%',
+						"render": function ( data, type, row ) {
+							return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
+						}
+					},
+					{
+						"data": 'triggerCode',
+                        "width":'12%',
+						"render": function ( data, type, row ) {
+							var html = data;
+							if (data == 200) {
+								html = '<span style="color: green">'+ I18n.system_success +'</span>';
+							} else if (data == 500) {
+								html = '<span style="color: red">'+ I18n.system_fail +'</span>';
+							} else if (data == 0) {
+                                html = '';
+							}
+                            return html;
+						}
+					},
+					{
+						"data": 'triggerMsg',
+                        "width":'12%',
+						"render": function ( data, type, row ) {
+							return data?'<a class="logTips" href="javascript:;" >'+ I18n.system_show +'<span style="display:none;">'+ data +'</span></a>':I18n.system_empty;
+						}
+					},
+	                { 
+	                	"data": 'handleTime',
+                        "width":'16%',
+	                	"render": function ( data, type, row ) {
+	                		return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
+	                	}
+	                },
+	                {
+						"data": 'handleCode',
+                        "width":'12%',
+						"render": function ( data, type, row ) {
+                            var html = data;
+                            if (data == 200) {
+                                html = '<span style="color: green">'+ I18n.joblog_handleCode_200 +'</span>';
+                            } else if (data == 500) {
+                                html = '<span style="color: red">'+ I18n.joblog_handleCode_500 +'</span>';
+                            } else if (data == 502) {
+                                html = '<span style="color: red">'+ I18n.joblog_handleCode_502 +'</span>';
+                            } else if (data == 0) {
+                                html = '';
+                            }
+                            return html;
+						}
+	                },
+	                { 
+	                	"data": 'handleMsg',
+                        "width":'12%',
+	                	"render": function ( data, type, row ) {
+	                		return data?'<a class="logTips" href="javascript:;" >'+ I18n.system_show +'<span style="display:none;">'+ data +'</span></a>':I18n.system_empty;
+	                	}
+	                },
+	                {
+						"data": 'handleMsg' ,
+						"bSortable": false,
+                        "width":'10%',
+	                	"render": function ( data, type, row ) {
+	                		// better support expression or string, not function
+	                		return function () {
+		                		if (row.triggerCode == 200){
+		                			var temp = '<a href="javascript:;" class="logDetail" _id="'+ row.id +'">'+ I18n.joblog_rolling_log +'</a>';
+		                			if(row.handleCode == 0){
+		                				temp += '<br><a href="javascript:;" class="logKill" _id="'+ row.id +'" style="color: red;" >'+ I18n.joblog_kill_log +'</a>';
+		                			}
+		                			return temp;
+		                		}
+		                		return null;	
+	                		}
+	                	}
+	                }
+	            ],
+        "language" : {
+            "sProcessing" : I18n.dataTable_sProcessing ,
+            "sLengthMenu" : I18n.dataTable_sLengthMenu ,
+            "sZeroRecords" : I18n.dataTable_sZeroRecords ,
+            "sInfo" : I18n.dataTable_sInfo ,
+            "sInfoEmpty" : I18n.dataTable_sInfoEmpty ,
+            "sInfoFiltered" : I18n.dataTable_sInfoFiltered ,
+            "sInfoPostFix" : "",
+            "sSearch" : I18n.dataTable_sSearch ,
+            "sUrl" : "",
+            "sEmptyTable" : I18n.dataTable_sEmptyTable ,
+            "sLoadingRecords" : I18n.dataTable_sLoadingRecords ,
+            "sInfoThousands" : ",",
+            "oPaginate" : {
+                "sFirst" : I18n.dataTable_sFirst ,
+                "sPrevious" : I18n.dataTable_sPrevious ,
+                "sNext" : I18n.dataTable_sNext ,
+                "sLast" : I18n.dataTable_sLast
+            },
+            "oAria" : {
+                "sSortAscending" : I18n.dataTable_sSortAscending ,
+                "sSortDescending" : I18n.dataTable_sSortDescending
+            }
+        }
+	});
+	
+	// logTips alert
+	$('#joblog_list').on('click', '.logTips', function(){
+		var msg = $(this).find('span').html();
+		ComAlertTec.show(msg);
+	});
+	
+	// search Btn
+	$('#searchBtn').on('click', function(){
+		logTable.fnDraw();
+	});
+	
+	// logDetail look
+	$('#joblog_list').on('click', '.logDetail', function(){
+		var _id = $(this).attr('_id');
+		
+		window.open(base_url + '/joblog/logDetailPage?id=' + _id);
+		return;
+	});
+
+	/**
+	 * log Kill
+	 */
+	$('#joblog_list').on('click', '.logKill', function(){
+		var _id = $(this).attr('_id');
+
+        layer.confirm( (I18n.system_ok + I18n.joblog_kill_log + '?'), {
+        	icon: 3,
+			title: I18n.system_tips ,
+            btn: [ I18n.system_ok, I18n.system_cancel ]
+		}, function(index){
+            layer.close(index);
+
+            $.ajax({
+                type : 'POST',
+                url : base_url + '/joblog/logKill',
+                data : {"id":_id},
+                dataType : "json",
+                success : function(data){
+                    if (data.code == 200) {
+                        layer.open({
+                            title: I18n.system_tips,
+                            btn: [ I18n.system_ok ],
+                            content: I18n.system_opt_suc ,
+                            icon: '1',
+                            end: function(layero, index){
+                                logTable.fnDraw();
+                            }
+                        });
+                    } else {
+                        layer.open({
+                            title: I18n.system_tips,
+                            btn: [ I18n.system_ok ],
+                            content: (data.msg || I18n.system_opt_fail ),
+                            icon: '2'
+                        });
+                    }
+                },
+            });
+        });
+
+	});
+
+	/**
+	 * clear Log
+	 */
+	$('#clearLog').on('click', function(){
+
+		var jobGroup = $('#jobGroup').val();
+		var jobId = $('#jobId').val();
+
+		var jobGroupText = $("#jobGroup").find("option:selected").text();
+		var jobIdText = $("#jobId").find("option:selected").text();
+
+		$('#clearLogModal input[name=jobGroup]').val(jobGroup);
+		$('#clearLogModal input[name=jobId]').val(jobId);
+
+		$('#clearLogModal .jobGroupText').val(jobGroupText);
+		$('#clearLogModal .jobIdText').val(jobIdText);
+
+		$('#clearLogModal').modal('show');
+
+	});
+	$("#clearLogModal .ok").on('click', function(){
+		$.post(base_url + "/joblog/clearLog",  $("#clearLogModal .form").serialize(), function(data, status) {
+			if (data.code == "200") {
+				$('#clearLogModal').modal('hide');
+				layer.open({
+					title: I18n.system_tips ,
+                    btn: [ I18n.system_ok ],
+					content: (I18n.joblog_clean_log + I18n.system_success) ,
+					icon: '1',
+					end: function(layero, index){
+						logTable.fnDraw();
+					}
+				});
+			} else {
+				layer.open({
+					title: I18n.system_tips ,
+                    btn: [ I18n.system_ok ],
+					content: (data.msg || (I18n.joblog_clean_log + I18n.system_fail) ),
+					icon: '2'
+				});
+			}
+		});
+	});
+	$("#clearLogModal").on('hide.bs.modal', function () {
+		$("#clearLogModal .form")[0].reset();
+	});
+
+});
+
+
+// Com Alert by Tec theme
+var ComAlertTec = {
+	html:function(){
+		var html =
+			'<div class="modal fade" id="ComAlertTec" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">' +
+			'<div class="modal-dialog">' +
+			'<div class="modal-content-tec">' +
+			'<div class="modal-body"><div class="alert" style="color:#fff;"></div></div>' +
+			'<div class="modal-footer">' +
+			'<div class="text-center" >' +
+			'<button type="button" class="btn btn-info ok" data-dismiss="modal" >'+ I18n.system_ok +'</button>' +
+			'</div>' +
+			'</div>' +
+			'</div>' +
+			'</div>' +
+			'</div>';
+		return html;
+	},
+	show:function(msg, callback){
+		// dom init
+		if ($('#ComAlertTec').length == 0){
+			$('body').append(ComAlertTec.html());
+		}
+
+		// init com alert
+		$('#ComAlertTec .alert').html(msg);
+		$('#ComAlertTec').modal('show');
+
+		$('#ComAlertTec .ok').click(function(){
+			$('#ComAlertTec').modal('hide');
+			if(typeof callback == 'function') {
+				callback();
+			}
+		});
+	}
+};

+ 47 - 47
xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java

@@ -1,47 +1,47 @@
-package com.xxl.job.core.handler;
-
-import com.xxl.job.core.biz.model.ReturnT;
-
-/**
- * job handler
- *
- * @author xuxueli 2015-12-19 19:06:38
- */
-public abstract class IJobHandler {
-
-
-	/** success */
-	public static final ReturnT<String> SUCCESS = new ReturnT<String>(200, null);
-	/** fail */
-	public static final ReturnT<String> FAIL = new ReturnT<String>(500, null);
-	/** fail timeout */
-	public static final ReturnT<String> FAIL_TIMEOUT = new ReturnT<String>(502, null);
-
-
-	/**
-	 * execute handler, invoked when executor receives a scheduling request
-	 *
-	 * @param param
-	 * @return
-	 * @throws Exception
-	 */
-	public abstract ReturnT<String> execute(String param) throws Exception;
-
-
-	/**
-	 * init handler, invoked when JobThread init
-	 */
-	public void init() {
-		// TODO
-	}
-
-
-	/**
-	 * destroy handler, invoked when JobThread destroy
-	 */
-	public void destroy() {
-		// TODO
-	}
-
-
-}
+package com.xxl.job.core.handler;
+
+import com.xxl.job.core.biz.model.ReturnT;
+
+/**
+ * job handler
+ *
+ * @author xuxueli 2015-12-19 19:06:38
+ */
+public abstract class IJobHandler {
+
+
+	/** success */
+	public static final ReturnT<String> SUCCESS = new ReturnT<String>(200, null);
+	/** fail */
+	public static final ReturnT<String> FAIL = new ReturnT<String>(500, null);
+	/** fail timeout */
+	public static final ReturnT<String> FAIL_TIMEOUT = new ReturnT<String>(502, null);
+
+
+	/**
+	 * execute handler, invoked when executor receives a scheduling request
+	 *
+	 * @param param
+	 * @return
+	 * @throws Exception
+	 */
+	public abstract ReturnT<String> execute(String param) throws Exception;
+
+
+	/**
+	 * init handler, invoked when JobThread init
+	 */
+	public void init() {
+		// TODO
+	}
+
+
+	/**
+	 * destroy handler, invoked when JobThread destroy
+	 */
+	public void destroy() {
+		// TODO
+	}
+
+
+}