定时任务提醒
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
59431a713e
commit
0b4b665d1b
@ -0,0 +1,25 @@
|
|||||||
|
package com.ruoyi.flyingbook.domain;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 【请填写功能名称】对象 event_log
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
* @date 2023-03-15
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class LogCount implements Serializable {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private Date startTime;
|
||||||
|
|
||||||
|
private Date endTime;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private Integer count;
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.ruoyi.quartz.domain;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务调度日志表 sys_job_log
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class JobLogCount implements Serializable
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
|
||||||
|
private String jobName;
|
||||||
|
|
||||||
|
private Integer count;
|
||||||
|
}
|
@ -0,0 +1,100 @@
|
|||||||
|
package com.ruoyi.quartz.task;
|
||||||
|
|
||||||
|
import com.ruoyi.common.enums.EventOperateType;
|
||||||
|
import com.ruoyi.flyingbook.LarkHelper.LarkRobotHelper;
|
||||||
|
import com.ruoyi.flyingbook.domain.LogCount;
|
||||||
|
import com.ruoyi.flyingbook.mapper.EventLogMapper;
|
||||||
|
import com.ruoyi.flyingbook.mapper.EventMapper;
|
||||||
|
import com.ruoyi.flyingbook.service.IEventLogService;
|
||||||
|
import com.ruoyi.flyingbook.service.IEventService;
|
||||||
|
import com.ruoyi.quartz.domain.JobLogCount;
|
||||||
|
import com.ruoyi.quartz.domain.SysJobLog;
|
||||||
|
import com.ruoyi.quartz.mapper.SysJobLogMapper;
|
||||||
|
import com.ruoyi.quartz.service.ISysJobService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务监控
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component("monitorJobTask")
|
||||||
|
public class MonitorJobTask {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SysJobLogMapper jobLogMapper;
|
||||||
|
@Autowired
|
||||||
|
private EventLogMapper eventLogMapper;
|
||||||
|
@Autowired
|
||||||
|
private LarkRobotHelper larkRobotHelper;
|
||||||
|
|
||||||
|
@Value("${lark.robot.group}")
|
||||||
|
private String robotGroup;
|
||||||
|
|
||||||
|
public void monitor() {
|
||||||
|
log.info("scheduledRemindersTask start");
|
||||||
|
Date todayStartTime = this.getTodayStartTime();
|
||||||
|
Date endTime = new Date();
|
||||||
|
Map<String, Integer> jobLogMap = getJobLogCountMap(todayStartTime,endTime);
|
||||||
|
Map<String, Integer> eventLogCountMap = getEventLogCountMap(todayStartTime,endTime);
|
||||||
|
Map<String, String> map = this.getMap();
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (Map.Entry<String, String> entry : map.entrySet()) {
|
||||||
|
Integer jobCount = jobLogMap.get(entry.getKey());
|
||||||
|
sb.append(entry.getKey()).append("\r\n");
|
||||||
|
if (jobCount != null && jobCount > 0){
|
||||||
|
Integer eventLogCount = eventLogCountMap.getOrDefault(entry.getValue(),0);
|
||||||
|
sb.append(String.format("执行成功%s条",eventLogCount));
|
||||||
|
}else {
|
||||||
|
sb.append("执行失败");
|
||||||
|
}
|
||||||
|
sb.append("\r\n");
|
||||||
|
}
|
||||||
|
larkRobotHelper.sendMessageByBot(robotGroup,sb.toString());
|
||||||
|
log.info("scheduledRemindersTask end");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Date getTodayStartTime(){
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
|
calendar.set(Calendar.MINUTE, 0);
|
||||||
|
calendar.set(Calendar.SECOND, 0);
|
||||||
|
return calendar.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, Integer> getJobLogCountMap(Date startDate,Date endDate){
|
||||||
|
SysJobLog sysJobLog = new SysJobLog();
|
||||||
|
sysJobLog.setStartTime(startDate);
|
||||||
|
sysJobLog.setStopTime(endDate);
|
||||||
|
List<JobLogCount> jobLogCounts = jobLogMapper.countJobLogByName(sysJobLog);
|
||||||
|
return jobLogCounts.stream()
|
||||||
|
.collect(Collectors.toMap(JobLogCount::getJobName, JobLogCount::getCount, (k1, k2) -> k1));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, Integer> getEventLogCountMap(Date startDate,Date endDate){
|
||||||
|
LogCount logCount = new LogCount();
|
||||||
|
logCount.setStartTime(startDate);
|
||||||
|
logCount.setEndTime(endDate);
|
||||||
|
List<LogCount> logCountList = eventLogMapper.countByType(logCount);
|
||||||
|
return logCountList.stream()
|
||||||
|
.collect(Collectors.toMap(LogCount::getName, LogCount::getCount, (k1, k2) -> k1));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Map<String,String> getMap(){
|
||||||
|
Map<String,String> map = new HashMap<>();
|
||||||
|
map.put("邮箱信息同步到飞书-新",EventOperateType.SYNC_MAIL.getCode());
|
||||||
|
map.put("飞书定时提醒-新", EventOperateType.SCHEDULE_REMINDER.getCode());
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,93 +1,120 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<!DOCTYPE mapper
|
<!DOCTYPE mapper
|
||||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.ruoyi.quartz.mapper.SysJobLogMapper">
|
<mapper namespace="com.ruoyi.quartz.mapper.SysJobLogMapper">
|
||||||
|
|
||||||
<resultMap type="SysJobLog" id="SysJobLogResult">
|
<resultMap type="SysJobLog" id="SysJobLogResult">
|
||||||
<id property="jobLogId" column="job_log_id" />
|
<id property="jobLogId" column="job_log_id"/>
|
||||||
<result property="jobName" column="job_name" />
|
<result property="jobName" column="job_name"/>
|
||||||
<result property="jobGroup" column="job_group" />
|
<result property="jobGroup" column="job_group"/>
|
||||||
<result property="invokeTarget" column="invoke_target" />
|
<result property="invokeTarget" column="invoke_target"/>
|
||||||
<result property="jobMessage" column="job_message" />
|
<result property="jobMessage" column="job_message"/>
|
||||||
<result property="status" column="status" />
|
<result property="status" column="status"/>
|
||||||
<result property="exceptionInfo" column="exception_info" />
|
<result property="exceptionInfo" column="exception_info"/>
|
||||||
<result property="createTime" column="create_time" />
|
<result property="createTime" column="create_time"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<sql id="selectJobLogVo">
|
<sql id="selectJobLogVo">
|
||||||
select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, create_time
|
select job_log_id,
|
||||||
from sys_job_log
|
job_name,
|
||||||
|
job_group,
|
||||||
|
invoke_target,
|
||||||
|
job_message,
|
||||||
|
status,
|
||||||
|
exception_info,
|
||||||
|
create_time
|
||||||
|
from sys_job_log
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<select id="selectJobLogList" parameterType="SysJobLog" resultMap="SysJobLogResult">
|
<select id="selectJobLogList" parameterType="SysJobLog" resultMap="SysJobLogResult">
|
||||||
<include refid="selectJobLogVo"/>
|
<include refid="selectJobLogVo"/>
|
||||||
<where>
|
<where>
|
||||||
<if test="jobName != null and jobName != ''">
|
<if test="jobName != null and jobName != ''">
|
||||||
AND job_name like concat('%', #{jobName}, '%')
|
AND job_name like concat('%', #{jobName}, '%')
|
||||||
</if>
|
</if>
|
||||||
<if test="jobGroup != null and jobGroup != ''">
|
<if test="jobGroup != null and jobGroup != ''">
|
||||||
AND job_group = #{jobGroup}
|
AND job_group = #{jobGroup}
|
||||||
</if>
|
</if>
|
||||||
<if test="status != null and status != ''">
|
<if test="status != null and status != ''">
|
||||||
AND status = #{status}
|
AND status = #{status}
|
||||||
</if>
|
</if>
|
||||||
<if test="invokeTarget != null and invokeTarget != ''">
|
<if test="invokeTarget != null and invokeTarget != ''">
|
||||||
AND invoke_target like concat('%', #{invokeTarget}, '%')
|
AND invoke_target like concat('%', #{invokeTarget}, '%')
|
||||||
</if>
|
</if>
|
||||||
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
||||||
and date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
|
and date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
|
||||||
</if>
|
</if>
|
||||||
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
|
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
|
||||||
and date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
|
and date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
|
||||||
</if>
|
</if>
|
||||||
</where>
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectJobLogAll" resultMap="SysJobLogResult">
|
<select id="countJobLogByName" parameterType="SysJobLog" resultType="com.ruoyi.quartz.domain.JobLogCount">
|
||||||
<include refid="selectJobLogVo"/>
|
select job_name as jobName,count(job_log_id) as `count`
|
||||||
</select>
|
from sys_job_log
|
||||||
|
<where>
|
||||||
|
<if test="jobName != null and jobName != ''">
|
||||||
|
AND job_name like concat('%', #{jobName}, '%')
|
||||||
|
</if>
|
||||||
|
<if test="startTime != null">
|
||||||
|
<![CDATA[ and create_time >= #{startTime} ]]>
|
||||||
|
</if>
|
||||||
|
|
||||||
<select id="selectJobLogById" parameterType="Long" resultMap="SysJobLogResult">
|
<if test="stopTime != null">
|
||||||
<include refid="selectJobLogVo"/>
|
<![CDATA[ and create_time <= #{stopTime} ]]>
|
||||||
where job_log_id = #{jobLogId}
|
</if>
|
||||||
</select>
|
</where>
|
||||||
|
group by job_name
|
||||||
|
</select>
|
||||||
|
|
||||||
<delete id="deleteJobLogById" parameterType="Long">
|
<select id="selectJobLogAll" resultMap="SysJobLogResult">
|
||||||
delete from sys_job_log where job_log_id = #{jobLogId}
|
<include refid="selectJobLogVo"/>
|
||||||
</delete>
|
</select>
|
||||||
|
|
||||||
<delete id="deleteJobLogByIds" parameterType="Long">
|
<select id="selectJobLogById" parameterType="Long" resultMap="SysJobLogResult">
|
||||||
delete from sys_job_log where job_log_id in
|
<include refid="selectJobLogVo"/>
|
||||||
<foreach collection="array" item="jobLogId" open="(" separator="," close=")">
|
where job_log_id = #{jobLogId}
|
||||||
#{jobLogId}
|
</select>
|
||||||
|
|
||||||
|
<delete id="deleteJobLogById" parameterType="Long">
|
||||||
|
delete
|
||||||
|
from sys_job_log
|
||||||
|
where job_log_id = #{jobLogId}
|
||||||
|
</delete>
|
||||||
|
|
||||||
|
<delete id="deleteJobLogByIds" parameterType="Long">
|
||||||
|
delete from sys_job_log where job_log_id in
|
||||||
|
<foreach collection="array" item="jobLogId" open="(" separator="," close=")">
|
||||||
|
#{jobLogId}
|
||||||
</foreach>
|
</foreach>
|
||||||
</delete>
|
</delete>
|
||||||
|
|
||||||
<update id="cleanJobLog">
|
<update id="cleanJobLog">
|
||||||
truncate table sys_job_log
|
truncate table sys_job_log
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
<insert id="insertJobLog" parameterType="SysJobLog">
|
<insert id="insertJobLog" parameterType="SysJobLog">
|
||||||
insert into sys_job_log(
|
insert into sys_job_log(
|
||||||
<if test="jobLogId != null and jobLogId != 0">job_log_id,</if>
|
<if test="jobLogId != null and jobLogId != 0">job_log_id,</if>
|
||||||
<if test="jobName != null and jobName != ''">job_name,</if>
|
<if test="jobName != null and jobName != ''">job_name,</if>
|
||||||
<if test="jobGroup != null and jobGroup != ''">job_group,</if>
|
<if test="jobGroup != null and jobGroup != ''">job_group,</if>
|
||||||
<if test="invokeTarget != null and invokeTarget != ''">invoke_target,</if>
|
<if test="invokeTarget != null and invokeTarget != ''">invoke_target,</if>
|
||||||
<if test="jobMessage != null and jobMessage != ''">job_message,</if>
|
<if test="jobMessage != null and jobMessage != ''">job_message,</if>
|
||||||
<if test="status != null and status != ''">status,</if>
|
<if test="status != null and status != ''">status,</if>
|
||||||
<if test="exceptionInfo != null and exceptionInfo != ''">exception_info,</if>
|
<if test="exceptionInfo != null and exceptionInfo != ''">exception_info,</if>
|
||||||
create_time
|
create_time
|
||||||
)values(
|
)values(
|
||||||
<if test="jobLogId != null and jobLogId != 0">#{jobLogId},</if>
|
<if test="jobLogId != null and jobLogId != 0">#{jobLogId},</if>
|
||||||
<if test="jobName != null and jobName != ''">#{jobName},</if>
|
<if test="jobName != null and jobName != ''">#{jobName},</if>
|
||||||
<if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if>
|
<if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if>
|
||||||
<if test="invokeTarget != null and invokeTarget != ''">#{invokeTarget},</if>
|
<if test="invokeTarget != null and invokeTarget != ''">#{invokeTarget},</if>
|
||||||
<if test="jobMessage != null and jobMessage != ''">#{jobMessage},</if>
|
<if test="jobMessage != null and jobMessage != ''">#{jobMessage},</if>
|
||||||
<if test="status != null and status != ''">#{status},</if>
|
<if test="status != null and status != ''">#{status},</if>
|
||||||
<if test="exceptionInfo != null and exceptionInfo != ''">#{exceptionInfo},</if>
|
<if test="exceptionInfo != null and exceptionInfo != ''">#{exceptionInfo},</if>
|
||||||
sysdate()
|
sysdate()
|
||||||
)
|
)
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
Loading…
Reference in new issue