Commit 3a30911e authored by co_dengxiongwen's avatar co_dengxiongwen

定时任务

parent 3dd83122
......@@ -95,7 +95,6 @@
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
</dependency>
</dependencies>
</project>
package com.devplatform.admin.common.scheduling;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.devplatform.admin.common.utils.Constants;
import com.devplatform.admin.modules.eq.bean.TimedTask;
import com.devplatform.admin.modules.eq.controller.EquipmentController;
import com.devplatform.admin.modules.eq.service.TimedTaskService;
import com.devplatform.admin.modules.sys.bean.SysSystemParams;
import com.devplatform.admin.modules.sys.service.SysSystemParamsService;
import com.devplatform.common.util.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* @author dxw
*/
@Component
@Order(2)
public class InitRunner implements CommandLineRunner {
@Autowired
private TimedTaskService timedTaskService;
@Autowired
private SysSystemParamsService sysSystemParamsService;
@Autowired
private EquipmentController equipmentController;
@Override
public void run(String... args) throws Exception {
try {
SysSystemParams sysSystemParams = sysSystemParamsService.getOne(new LambdaQueryWrapper<SysSystemParams>().last("limit 1"));
if(sysSystemParams.getType() == 1){
// 获取定时任务信息
TimedTask timedTask = timedTaskService.getOne(new LambdaQueryWrapper<TimedTask>().eq(TimedTask::getStatus,Constants.INT_1).last("limit 1"));
if(timedTask != null){
R r = equipmentController.timedTask(timedTask.getId(),timedTask.getStartTime(),timedTask.getEndTime(),Constants.INT_1,Constants.STRING_1);
if (!Constants.STRING_0.equals(r.get(Constants.CODE_WORD).toString())) {
System.err.println("定时任务启动失败!!");
}
}
}
} catch (Exception e) {
System.err.println("定时任务启动失败!");
e.printStackTrace();
}
}
}
package com.devplatform.admin.modules.eq.bean;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
/**
* @author dxw
* @date 2021/4/9
*/
public class SimpleJob implements Job {
private static Logger LOG = LoggerFactory.getLogger(SimpleJob.class);
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobKey jobKey = context.getJobDetail().getKey(); //jobKey长这样:group1.job6
LOG.info("执行任务。SimpleJob says: " + jobKey + " executing at " + new Date());
}
}
package com.devplatform.admin.modules.eq.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@ApiModel(value="定时任务对象",description="定时任务对象")
@TableName("timed_task")
public class TimedTask implements Serializable {
private static final long serialVersionUID = 1L;
/** 主键id */
@ApiModelProperty(value="主键ID",name="id")
@TableId
private java.lang.String id;
/** 开启时间(时分) */
@ApiModelProperty(value="开启时间(时分)",name="startTime")
private java.lang.String startTime;
/** 结束时间(时分) */
@ApiModelProperty(value="结束时间(时分)",name="endTime")
private java.lang.String endTime;
/** 创建人 */
@ApiModelProperty(value="创建人",name="createUserId")
private java.lang.String createUserId;
/** 创建时间 */
@ApiModelProperty(value="创建时间",name="createTime")
private java.util.Date createTime;
/** 修改人 */
@ApiModelProperty(value="修改人",name="updateUserId")
private java.lang.String updateUserId;
/** 修改时间 */
@ApiModelProperty(value="修改时间",name="updateTime")
private java.util.Date updateTime;
/** 执行状态(0未执行,1执行成功,2执行失败) */
@ApiModelProperty(value="执行状态(0未执行,1执行成功,2执行失败)",name="status")
private Integer status;
/** 是否已删除(0未删除,1已删除) */
@ApiModelProperty(value="是否已删除(0未删除,1已删除)",name="deleted")
private Integer deleted;
/** 站点ID */
@ApiModelProperty(value="站点ID",name="stationId")
private java.lang.String stationId;
/** 备用项1 */
@ApiModelProperty(value="备用项1",name="byx1")
private java.lang.String byx1;
/** 备用项2 */
@ApiModelProperty(value="备用项2",name="byx2")
private java.lang.String byx2;
/** 备用项3 */
@ApiModelProperty(value="备用项3",name="byx3")
private java.lang.String byx3;
}
......@@ -3,19 +3,29 @@ package com.devplatform.admin.modules.eq.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.devplatform.admin.common.utils.AbstractController;
import com.devplatform.admin.common.utils.Constants;
import com.devplatform.admin.modules.eq.bean.SimpleJob;
import com.devplatform.admin.modules.eq.bean.TimedTask;
import com.devplatform.admin.modules.eq.service.EquipmentService;
import com.devplatform.admin.modules.eq.service.TimedTaskService;
import com.devplatform.admin.modules.sys.bean.SysSystemParams;
import com.devplatform.admin.modules.sys.bean.SysSystemRunningTime;
import com.devplatform.admin.modules.sys.bean.SysUserEntity;
import com.devplatform.admin.modules.sys.service.SysSystemParamsService;
import com.devplatform.admin.modules.sys.service.SysSystemRunningTimeService;
import com.devplatform.common.util.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
......@@ -28,12 +38,17 @@ import java.util.Map;
@RestController
@RequestMapping("/equipment")
public class EquipmentController extends AbstractController {
private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
private static String JOB_GROUP_NAME = "quartz_name";
private static String TRIGGER_GROUP_NAME = "quartz_group";
@Autowired
private EquipmentService equipmentService;
@Autowired
private SysSystemParamsService sysSystemParamsService;
@Autowired
private SysSystemRunningTimeService sysSystemRunningTimeService;
@Autowired
private TimedTaskService timedTaskService;
/**
* 获取每个设备最新的参数值
......@@ -76,4 +91,141 @@ public class EquipmentController extends AbstractController {
sysSystemRunningTimeService.save(temp);
return R.ok();
}
/**
* @param jobName @Description 移除任务(使用默认的任务组名 , 触发器名 , 触发器组名)
*/
public static void removeJob(String jobName) {
TriggerKey triggerKey1 = TriggerKey.triggerKey(jobName+"-start", TRIGGER_GROUP_NAME);
TriggerKey triggerKey2 = TriggerKey.triggerKey(jobName+"-end", TRIGGER_GROUP_NAME);
JobKey jobKey1 = JobKey.jobKey(jobName+"-start", JOB_GROUP_NAME);
JobKey jobKey2 = JobKey.jobKey(jobName+"-end", JOB_GROUP_NAME);
try {
Scheduler sched = gSchedulerFactory.getScheduler();
Trigger trigger1 = (Trigger) sched.getTrigger(triggerKey1);
Trigger trigger2 = (Trigger) sched.getTrigger(triggerKey2);
if (trigger1 == null && trigger2 == null) {
return;
}
if(trigger1 != null){
// 停止触发器
sched.pauseTrigger(triggerKey1);
// 移除触发器
sched.unscheduleJob(triggerKey1);
// 删除任务
sched.deleteJob(jobKey1);
}
if(trigger2 != null){
// 停止触发器
sched.pauseTrigger(triggerKey2);
// 移除触发器
sched.unscheduleJob(triggerKey2);
// 删除任务
sched.deleteJob(jobKey2);
}
System.err.println("移除任务:" + jobName+"-start");
System.err.println("移除任务:" + jobName+"-end");
} catch (Exception ignored) {
System.err.println("移除定时任务出错");
}
}
@ApiOperation(value = "定时任务开启/关闭", notes = "定时任务开启")
@ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "String")
@PostMapping("/timedTask")
public R timedTask(String id, String startTime, String endTime, Integer status, String isReboot) {
TimedTask timedTask = null;
//如果重启是启动的定时任务,不用更新数据库
if(StringUtils.isBlank(isReboot)){
SysUserEntity user = getUser();
if(StringUtils.isBlank(id)){
timedTask = new TimedTask();
timedTask.setStartTime(startTime);
timedTask.setEndTime(endTime);
timedTask.setCreateTime(new Date());
timedTask.setCreateUserId(user.getUserId());
timedTask.setStatus(status);
timedTaskService.save(timedTask);
}else {
timedTask = timedTaskService.getOne(new LambdaQueryWrapper<TimedTask>().last("limit 1"));
timedTask.setStartTime(startTime);
timedTask.setEndTime(endTime);
timedTask.setStatus(status);
timedTask.setUpdateTime(new Date());
timedTask.setUpdateUserId(user.getUserId());
timedTaskService.update(timedTask, new LambdaQueryWrapper<TimedTask>().eq(TimedTask::getId,id));
}
id = timedTask.getId();
}
//开启
if (status == 1) {
//设置定时任务
R error = setTimeTask(id, startTime, endTime);
if (error != null) {
return error;
}
}else{
//关闭定时任务
removeJob(id);
}
return R.ok();
}
/**
* 设置定时任务
* @param id
* @param startTime
* @param endTime
* @return
*/
private R setTimeTask(String id, String startTime, String endTime){
JobDataMap resJobDataMap1 = new JobDataMap();
resJobDataMap1.put("type", 1);
JobDataMap resJobDataMap2 = new JobDataMap();
resJobDataMap2.put("type", 2);
JobDetail job1 = JobBuilder.newJob(SimpleJob.class).withIdentity(id+"-start", JOB_GROUP_NAME).usingJobData(resJobDataMap1).build();
String cron1 = createCron(startTime);
Trigger trigger1 = TriggerBuilder.newTrigger().withIdentity(id+"-start", TRIGGER_GROUP_NAME).startAt(new Date())
.withSchedule(CronScheduleBuilder.cronSchedule(cron1).withMisfireHandlingInstructionDoNothing()).build();
JobDetail job2 = JobBuilder.newJob(SimpleJob.class).withIdentity(id+"-end", JOB_GROUP_NAME).usingJobData(resJobDataMap2).build();
String cron2 = createCron(endTime);
Trigger trigger2 = TriggerBuilder.newTrigger().withIdentity(id+"-end", TRIGGER_GROUP_NAME).startAt(new Date())
.withSchedule(CronScheduleBuilder.cronSchedule(cron2).withMisfireHandlingInstructionDoNothing()).build();
try {
Scheduler sched = gSchedulerFactory.getScheduler();
// 交给scheduler去调度
sched.scheduleJob(job1, trigger1);
sched.scheduleJob(job2, trigger2);
// 启动
if (!sched.isShutdown()) {
sched.start();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.err.println("设置定时任务1:" + id + "\n\t下次运行时间:" + sdf.format(trigger1.getNextFireTime()));
System.err.println("设置定时任务2:" + id + "\n\t下次运行时间:" + sdf.format(trigger2.getNextFireTime()));
} catch (SchedulerException e) {
e.printStackTrace();
return R.error("时间设置有误!");
}
return null;
}
/**
* 生成cron表达
* @param time 时间
* @return cron
*/
public String createCron(String time){
String[] strs = time.split(":");
StringBuilder sb = new StringBuilder()
.append(0).append(" ")
.append(strs[1]).append(" ")
.append(strs[0]).append(" * * ? ");
return sb.toString();
}
}
package com.devplatform.admin.modules.eq.dao;
import org.apache.ibatis.annotations.Mapper;
import com.devplatform.admin.modules.eq.model.TimedTaskModel;
import com.devplatform.admin.modules.eq.bean.TimedTask;
import com.devplatform.common.dao.MyBaseMapper;
import java.util.List;
/**
* TimedTask Mapper
* 用于定时任务的数据库操作
* @author Administrator
*
*/
@Mapper
public interface TimedTaskDao extends MyBaseMapper<TimedTask> {
/**
* 查询分页数量
* @param model
* @return
*/
Integer queryPageByCount(TimedTaskModel model);
/**
* 查询定时任务分页数据
* @param model
* @return
*/
List<TimedTask> queryPageList(TimedTaskModel model);
}
package com.devplatform.admin.modules.eq.model;
import com.devplatform.admin.common.model.BaseModel;
import lombok.Data;
/**
* 定时任务的Model
* <br>
* @author 代码生成器产生
*/
@Data
public class TimedTaskModel extends BaseModel {
/** 主键id */
private java.lang.String id;
/** 开启时间(时分) */
private java.lang.String startTime;
/** 结束时间(时分) */
private java.lang.String endTime;
/** 创建人 */
private java.lang.String createUserId;
/** 创建时间 */
private java.util.Date createTime;
/** 修改人 */
private java.lang.String updateUserId;
/** 修改时间 */
private java.util.Date updateTime;
/** 执行状态(0未执行,1执行成功,2执行失败) */
private Integer status;
/** 是否已删除(0未删除,1已删除) */
private Integer deleted;
/** 站点ID */
private java.lang.String stationId;
/** 备用项1 */
private java.lang.String byx1;
/** 备用项2 */
private java.lang.String byx2;
/** 备用项3 */
private java.lang.String byx3;
}
package com.devplatform.admin.modules.eq.service;
import com.devplatform.common.service.MyBaseService;
import com.devplatform.admin.modules.eq.bean.TimedTask;
import com.devplatform.admin.modules.eq.model.TimedTaskModel;
import java.util.List;
/**
* 定时任务的service接口
* <br>
* <b>功能:</b>TimedTaskService<br>
* @author 代码生成器产生
*/
public interface TimedTaskService extends MyBaseService<TimedTask> {
/**
* 查询定时任务分页数据
* @param model
* @return
*/
List<TimedTask> queryPageList(TimedTaskModel model);
/**
* 根据ID删除定时任务对象
* @param ids
* @param userId
* @return void
*/
void deleteByFlagByIds(String[] ids, String userId);
}
package com.devplatform.admin.modules.eq.service.impl;
import org.springframework.stereotype.Service;
import com.devplatform.admin.modules.eq.model.TimedTaskModel;
import com.devplatform.admin.modules.eq.bean.TimedTask;
import com.devplatform.admin.modules.eq.dao.TimedTaskDao;
import com.devplatform.admin.modules.eq.service.TimedTaskService;
import com.devplatform.common.service.impl.MyBaseServiceImpl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 定时任务的service接口实现类
* <br>
* <b>功能:</b>TimedTaskServiceImpl<br>
* @author 代码生成器产生
*/
@Service("timedTaskService")
public class TimedTaskServiceImpl extends MyBaseServiceImpl<TimedTaskDao, TimedTask> implements TimedTaskService {
@Override
public List<TimedTask> queryPageList(TimedTaskModel model) {
Integer rowCount = baseMapper.queryPageByCount(model);
model.getPager().setRowCount(rowCount);
return baseMapper.queryPageList(model);
}
@Override
public void deleteByFlagByIds(String[] ids, String userId){
//用来暂存所有要删除的对象
List<TimedTask> beans = new ArrayList<TimedTask>();
//遍历ids数组
for(String id: ids){
TimedTask temp = new TimedTask();
temp.setId(id);
//将数据标记为删除
temp.setDeleted(1);
temp.setUpdateUserId(userId);
temp.setUpdateTime(new Date());
//将要删除的对象存放在list中
beans.add(temp);
}
//调用批量更新操作
updateBatchById(beans);
}
}
<?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.devplatform.admin.modules.eq.dao.TimedTaskDao">
<!-- Result Map -->
<resultMap id="BaseResultMap" type="com.devplatform.admin.modules.eq.bean.TimedTask">
<result column="id" property="id"/>
<result column="start_time" property="startTime"/>
<result column="end_time" property="endTime"/>
<result column="create_user_id" property="createUserId"/>
<result column="create_time" property="createTime"/>
<result column="update_user_id" property="updateUserId"/>
<result column="update_time" property="updateTime"/>
<result column="status" property="status"/>
<result column="deleted" property="deleted"/>
<result column="station_id" property="stationId"/>
<result column="byx1" property="byx1"/>
<result column="byx2" property="byx2"/>
<result column="byx3" property="byx3"/>
</resultMap>
<!-- timed_task table all fields -->
<sql id="Base_Column_List">
id,start_time,end_time,create_user_id,create_time,update_user_id,update_time,status,deleted,station_id,byx1,byx2,byx3
</sql>
<!-- 公共查询条件 -->
<sql id="Example_Where_Clause">
where t.deleted=0
<if test="id!=null and id!=''">and t.id = #{id}</if>
<if test="startTime!=null and startTime!=''">and t.start_time = #{startTime}</if>
<if test="endTime!=null and endTime!=''">and t.end_time = #{endTime}</if>
<if test="createUserId!=null and createUserId!=''">and t.create_user_id = #{createUserId}</if>
<if test="createTime!=null ">and t.create_time = #{createTime}</if>
<if test="updateUserId!=null and updateUserId!=''">and t.update_user_id = #{updateUserId}</if>
<if test="updateTime!=null ">and t.update_time = #{updateTime}</if>
<if test="status!=null ">and t.status = #{status}</if>
<if test="deleted!=null ">and t.deleted = #{deleted}</if>
<if test="stationId!=null and stationId!=''">and t.station_id = #{stationId}</if>
<if test="byx1!=null and byx1!=''">and t.byx1 = #{byx1}</if>
<if test="byx2!=null and byx2!=''">and t.byx2 = #{byx2}</if>
<if test="byx3!=null and byx3!=''">and t.byx3 = #{byx3}</if>
</sql>
<select id="queryPageByCount" parameterType="Object" resultType="java.lang.Integer">
select count(1) from timed_task t
<include refid="Example_Where_Clause"/>
</select>
<select id="queryPageList" parameterType="Object" resultMap="BaseResultMap">
select t.* from timed_task t
<include refid="Example_Where_Clause"/>
<if test="pager.orderCondition != null and pager.orderCondition != ''">
${pager.orderCondition}
</if>
<if test="pager.mysqlQueryCondition != null and pager.mysqlQueryCondition != ''">
${pager.mysqlQueryCondition}
</if>
</select>
</mapper>
......@@ -278,5 +278,10 @@
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
</dependencies>
</project>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment