task--定时任务完成

This commit is contained in:
taochengbo
2020-05-14 00:30:15 +08:00
parent 071658cc49
commit 3d539f9289
18 changed files with 529 additions and 327 deletions

View File

@ -1,8 +1,8 @@
package co.yixiang.modules.quartz.config;
import co.yixiang.modules.quartz.utils.QuartzManage;
import co.yixiang.modules.quartz.domain.QuartzJob;
import co.yixiang.modules.quartz.repository.QuartzJobRepository;
import co.yixiang.modules.quartz.service.QuartzJobService;
import co.yixiang.modules.quartz.utils.QuartzManage;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@ -16,12 +16,12 @@ import java.util.List;
@Component
public class JobRunner implements ApplicationRunner {
private final QuartzJobRepository quartzJobRepository;
private final QuartzJobService quartzJobService;
private final QuartzManage quartzManage;
public JobRunner(QuartzJobRepository quartzJobRepository, QuartzManage quartzManage) {
this.quartzJobRepository = quartzJobRepository;
public JobRunner(QuartzJobService quartzJobService, QuartzManage quartzManage) {
this.quartzJobService = quartzJobService;
this.quartzManage = quartzManage;
}
@ -32,7 +32,7 @@ public class JobRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments applicationArguments){
System.out.println("--------------------注入定时任务---------------------");
List<QuartzJob> quartzJobs = quartzJobRepository.findByIsPauseIsFalse();
List<QuartzJob> quartzJobs = quartzJobService.findByIsPauseIsFalse();
quartzJobs.forEach(quartzManage::addJob);
System.out.println("--------------------定时任务注入完成---------------------");
}

View File

@ -1,66 +1,74 @@
package co.yixiang.modules.quartz.domain;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import javax.validation.constraints.*;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author Zheng Jie
* @date 2019-01-07
*/
@Getter
@Setter
* @author hupeng
* @date 2020-05-13
*/
@Entity
@Table(name = "quartz_job")
public class QuartzJob implements Serializable {
@Data
@Table(name="quartz_job")
public class QuartzJob implements Serializable {
public static final String JOB_KEY = "JOB_KEY";
/** 定时任务ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@NotNull(groups = {Update.class})
@Column(name = "id")
private Long id;
/** 定时器名称 */
/** Spring Bean名称 */
@Column(name = "bean_name")
private String beanName;
/** cron 表达式 */
@Column(name = "cron_expression")
private String cronExpression;
/** 状态1暂停、0启用 */
@Column(name = "is_pause")
private Boolean isPause;
/** 任务名称 */
@Column(name = "job_name")
private String jobName;
/** Bean名称 */
@Column(name = "bean_name")
@NotBlank
private String beanName;
/** 方法名称 */
@Column(name = "method_name")
@NotBlank
private String methodName;
/** 参数 */
@Column(name = "params")
private String params;
/** cron表达式 */
@Column(name = "cron_expression")
@NotBlank
private String cronExpression;
/** 状态 */
@Column(name = "is_pause")
private Boolean isPause = false;
/** 备注 */
@Column(name = "remark")
@NotBlank
private String remark;
/** 创建日期 */
@Column(name = "create_time")
@CreationTimestamp
@TableField(fill= FieldFill.INSERT)
private Timestamp createTime;
public @interface Update {}
}
public void copy(QuartzJob source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}

View File

@ -1,58 +1,77 @@
package co.yixiang.modules.quartz.domain;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import java.io.Serializable;
import javax.validation.constraints.*;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author Zheng Jie
* @date 2019-01-07
*/
* @author hupeng
* @date 2020-05-13
*/
@Entity
@Data
@Table(name = "quartz_log")
@Table(name="quartz_log")
public class QuartzLog implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/** 任务名称 */
@Column(name = "job_name")
private String jobName;
/** Bean名称 */
@Column(name = "baen_name")
private String beanName;
private String baenName;
/** 方法名称 */
@Column(name = "method_name")
private String methodName;
/** 参数 */
@Column(name = "params")
private String params;
/** Bean名称 */
@Column(name = "create_time")
@TableField(fill= FieldFill.INSERT)
private Timestamp createTime;
/** cron表达式 */
@Column(name = "cron_expression")
private String cronExpression;
/** 异常详细 */
@Column(name = "exception_detail")
private String exceptionDetail;
/** 状态 */
@Column(name = "is_success")
private Boolean isSuccess;
/** 异常详细 */
@Column(name = "exception_detail",columnDefinition = "text")
private String exceptionDetail;
/** 任务名称 */
@Column(name = "job_name")
private String jobName;
/** 方法名称 */
@Column(name = "method_name")
private String methodName;
/** 参数 */
@Column(name = "params")
private String params;
/** 耗时(毫秒) */
@Column(name = "time")
private Long time;
/** 创建日期 */
@CreationTimestamp
@Column(name = "create_time")
private Timestamp createTime;
public void copy(QuartzLog source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}

View File

@ -1,19 +0,0 @@
package co.yixiang.modules.quartz.repository;
import co.yixiang.modules.quartz.domain.QuartzJob;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
/**
* @author Zheng Jie
* @date 2019-01-07
*/
public interface QuartzJobRepository extends JpaRepository<QuartzJob,Long>, JpaSpecificationExecutor<QuartzJob> {
/**
* 查询启用的任务
* @return List
*/
List<QuartzJob> findByIsPauseIsFalse();
}

View File

@ -1,13 +0,0 @@
package co.yixiang.modules.quartz.repository;
import co.yixiang.modules.quartz.domain.QuartzLog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author Zheng Jie
* @date 2019-01-07
*/
public interface QuartzLogRepository extends JpaRepository<QuartzLog,Long>, JpaSpecificationExecutor<QuartzLog> {
}

View File

@ -1,11 +1,18 @@
package co.yixiang.modules.quartz.rest;
import cn.hutool.core.util.StrUtil;
import co.yixiang.aop.log.Log;
import co.yixiang.dozer.service.IGenerator;
import co.yixiang.exception.BadRequestException;
import co.yixiang.modules.quartz.domain.QuartzJob;
import co.yixiang.modules.quartz.service.QuartzJobService;
import co.yixiang.modules.quartz.service.dto.JobQueryCriteria;
import co.yixiang.modules.quartz.service.QuartzLogService;
import co.yixiang.modules.quartz.service.dto.QuartzJobDto;
import co.yixiang.modules.quartz.service.dto.QuartzJobQueryCriteria;
import co.yixiang.modules.quartz.service.dto.QuartzLogDto;
import co.yixiang.modules.quartz.service.dto.QuartzLogQueryCriteria;
import co.yixiang.modules.shop.domain.YxUser;
import co.yixiang.modules.system.service.dto.JobQueryCriteria;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@ -18,7 +25,8 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Set;
import java.util.ArrayList;
import java.util.Arrays;
/**
* @author Zheng Jie
@ -33,16 +41,22 @@ public class QuartzJobController {
private static final String ENTITY_NAME = "quartzJob";
private final QuartzJobService quartzJobService;
private final IGenerator generator;
private final QuartzLogService quartzLogService;
public QuartzJobController(QuartzJobService quartzJobService) {
public QuartzJobController(QuartzJobService quartzJobService, IGenerator generator, QuartzLogService quartzLogService) {
this.quartzJobService = quartzJobService;
this.generator = generator;
this.quartzLogService = quartzLogService;
}
@Log("查询定时任务")
@ApiOperation("查询定时任务")
@GetMapping
@PreAuthorize("@el.check('admin','timing:list')")
public ResponseEntity<Object> getJobs(JobQueryCriteria criteria, Pageable pageable){
public ResponseEntity<Object> getJobs(QuartzJobQueryCriteria criteria, Pageable pageable){
return new ResponseEntity<>(quartzJobService.queryAll(criteria,pageable), HttpStatus.OK);
}
@ -50,23 +64,23 @@ public class QuartzJobController {
@ApiOperation("导出任务数据")
@GetMapping(value = "/download")
@PreAuthorize("@el.check('admin','timing:list')")
public void download(HttpServletResponse response, JobQueryCriteria criteria) throws IOException {
quartzJobService.download(quartzJobService.queryAll(criteria), response);
public void download(HttpServletResponse response, QuartzJobQueryCriteria criteria) throws IOException {
quartzJobService.download(generator.convert(quartzJobService.queryAll(criteria),QuartzJobDto.class), response);
}
@Log("导出日志数据")
@ApiOperation("导出日志数据")
@GetMapping(value = "/logs/download")
@PreAuthorize("@el.check('admin','timing:list')")
public void downloadLog(HttpServletResponse response, JobQueryCriteria criteria) throws IOException {
quartzJobService.downloadLog(quartzJobService.queryAllLog(criteria), response);
public void downloadLog(HttpServletResponse response, QuartzLogQueryCriteria criteria) throws IOException {
quartzLogService.download(generator.convert(quartzLogService.queryAll(criteria), QuartzLogDto.class), response);
}
@ApiOperation("查询任务执行日志")
@GetMapping(value = "/logs")
@PreAuthorize("@el.check('admin','timing:list')")
public ResponseEntity<Object> getJobLogs(JobQueryCriteria criteria, Pageable pageable){
return new ResponseEntity<>(quartzJobService.queryAllLog(criteria,pageable), HttpStatus.OK);
public ResponseEntity<Object> getJobLogs(QuartzLogQueryCriteria criteria, Pageable pageable){
return new ResponseEntity<>(quartzLogService.queryAll(criteria,pageable), HttpStatus.OK);
}
@Log("新增定时任务")
@ -78,16 +92,16 @@ public class QuartzJobController {
if (resources.getId() != null) {
throw new BadRequestException("A new "+ ENTITY_NAME +" cannot already have an ID");
}
return new ResponseEntity<>(quartzJobService.create(resources),HttpStatus.CREATED);
return new ResponseEntity<>(quartzJobService.save(resources),HttpStatus.CREATED);
}
@Log("修改定时任务")
@ApiOperation("修改定时任务")
@PutMapping
@PreAuthorize("@el.check('admin','timing:edit')")
public ResponseEntity<Object> update(@Validated(QuartzJob.Update.class) @RequestBody QuartzJob resources){
public ResponseEntity<Object> update(@Validated @RequestBody QuartzJob resources){
//if(StrUtil.isNotEmpty("22")) throw new BadRequestException("演示环境禁止操作");
quartzJobService.update(resources);
quartzJobService.saveOrUpdate(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@ -97,7 +111,7 @@ public class QuartzJobController {
@PreAuthorize("@el.check('admin','timing:edit')")
public ResponseEntity<Object> updateIsPause(@PathVariable Long id){
//if(StrUtil.isNotEmpty("22")) throw new BadRequestException("演示环境禁止操作");
quartzJobService.updateIsPause(quartzJobService.findById(id));
quartzJobService.updateIsPause(quartzJobService.getOne(new QueryWrapper<QuartzJob>().eq("uid",id)));
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@ -107,7 +121,7 @@ public class QuartzJobController {
@PreAuthorize("@el.check('admin','timing:edit')")
public ResponseEntity<Object> execution(@PathVariable Long id){
//if(StrUtil.isNotEmpty("22")) throw new BadRequestException("演示环境禁止操作");
quartzJobService.execution(quartzJobService.findById(id));
quartzJobService.execution(quartzJobService.getOne(new QueryWrapper<QuartzJob>().eq("id",id)));
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@ -115,9 +129,9 @@ public class QuartzJobController {
@ApiOperation("删除定时任务")
@DeleteMapping
@PreAuthorize("@el.check('admin','timing:del')")
public ResponseEntity<Object> delete(@RequestBody Set<Long> ids){
public ResponseEntity<Object> delete(@RequestBody Integer[] ids){
//if(StrUtil.isNotEmpty("22")) throw new BadRequestException("演示环境禁止操作");
quartzJobService.delete(ids);
quartzJobService.removeByIds(new ArrayList<>(Arrays.asList(ids)));
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@ -1,76 +1,43 @@
package co.yixiang.modules.quartz.service;
import co.yixiang.common.service.BaseService;
import co.yixiang.modules.quartz.domain.QuartzJob;
import co.yixiang.modules.quartz.domain.QuartzLog;
import co.yixiang.modules.quartz.service.dto.JobQueryCriteria;
import co.yixiang.modules.quartz.service.dto.QuartzJobDto;
import co.yixiang.modules.quartz.service.dto.QuartzJobQueryCriteria;
import org.springframework.data.domain.Pageable;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
import java.util.List;
import java.util.Set;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
/**
* @author Zheng Jie
* @date 2019-01-07
*/
public interface QuartzJobService {
* @author hupeng
* @date 2020-05-13
*/
public interface QuartzJobService extends BaseService<QuartzJob>{
/**
* 查询数据分页
* @param criteria 条件
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(QuartzJobQueryCriteria criteria, Pageable pageable);
/**
* 分页查询
* @param criteria 条件
* @param pageable 分页参数
* @return /
*/
Object queryAll(JobQueryCriteria criteria, Pageable pageable);
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<QuartzJobDto>
*/
List<QuartzJob> queryAll(QuartzJobQueryCriteria criteria);
/**
* 查询全部
* @param criteria 条件
* @return /
*/
List<QuartzJob> queryAll(JobQueryCriteria criteria);
* 导出数据
* @param all 待导出的数据
* @param response /
* @throws IOException /
*/
void download(List<QuartzJobDto> all, HttpServletResponse response) throws IOException;
/**
* 分页查询日志
* @param criteria 条件
* @param pageable 分页参数
* @return /
*/
Object queryAllLog(JobQueryCriteria criteria, Pageable pageable);
/**
* 查询全部
* @param criteria 条件
* @return /
*/
List<QuartzLog> queryAllLog(JobQueryCriteria criteria);
/**
* 创建
* @param resources /
* @return /
*/
QuartzJob create(QuartzJob resources);
/**
* 编辑
* @param resources /
*/
void update(QuartzJob resources);
/**
* 删除任务
* @param ids /
*/
void delete(Set<Long> ids);
/**
* 根据ID查询
* @param id ID
* @return /
*/
QuartzJob findById(Long id);
/**
* 更改定时任务状态
@ -85,18 +52,8 @@ public interface QuartzJobService {
void execution(QuartzJob quartzJob);
/**
* 导出定时任务
* @param queryAll 待导出的数据
* @param response /
* @throws IOException /
* 查询启用的任务
* @return List
*/
void download(List<QuartzJob> queryAll, HttpServletResponse response) throws IOException;
/**
* 导出定时任务日志
* @param queryAllLog 待导出的数据
* @param response /
* @throws IOException /
*/
void downloadLog(List<QuartzLog> queryAllLog, HttpServletResponse response) throws IOException;
List<QuartzJob> findByIsPauseIsFalse();
}

View File

@ -0,0 +1,40 @@
package co.yixiang.modules.quartz.service;
import co.yixiang.common.service.BaseService;
import co.yixiang.modules.quartz.domain.QuartzLog;
import co.yixiang.modules.quartz.service.dto.QuartzLogDto;
import co.yixiang.modules.quartz.service.dto.QuartzLogQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
/**
* @author hupeng
* @date 2020-05-13
*/
public interface QuartzLogService extends BaseService<QuartzLog>{
/**
* 查询数据分页
* @param criteria 条件
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(QuartzLogQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<QuartzLogDto>
*/
List<QuartzLog> queryAll(QuartzLogQueryCriteria criteria);
/**
* 导出数据
* @param all 待导出的数据
* @param response /
* @throws IOException /
*/
void download(List<QuartzLogDto> all, HttpServletResponse response) throws IOException;
}

View File

@ -0,0 +1,41 @@
package co.yixiang.modules.quartz.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author hupeng
* @date 2020-05-13
*/
@Data
public class QuartzJobDto implements Serializable {
/** 定时任务ID */
private Long id;
/** Bean名称 */
private String beanName;
/** cron 表达式 */
private String cronExpression;
/** 状态1暂停、0启用 */
private Boolean isPause;
/** 任务名称 */
private String jobName;
/** 方法名称 */
private String methodName;
/** 参数 */
private String params;
/** 备注 */
private String remark;
/** 创建日期 */
private Timestamp createTime;
}

View File

@ -1,17 +1,17 @@
package co.yixiang.modules.quartz.service.dto;
import co.yixiang.annotation.Query;
import lombok.Data;
import java.sql.Timestamp;
import java.util.List;
import co.yixiang.annotation.Query;
/**
* @author Zheng Jie
* @date 2019-6-4 10:33:02
*/
* @author hupeng
* @date 2020-05-13
*/
@Data
public class JobQueryCriteria {
public class QuartzJobQueryCriteria{
@Query(type = Query.Type.INNER_LIKE)
private String jobName;
@ -19,6 +19,9 @@ public class JobQueryCriteria {
@Query
private Boolean isSuccess;
@Query
private Boolean isPause;
@Query(type = Query.Type.BETWEEN)
private List<Timestamp> createTime;
}

View File

@ -0,0 +1,40 @@
package co.yixiang.modules.quartz.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author hupeng
* @date 2020-05-13
*/
@Data
public class QuartzLogDto implements Serializable {
/** 定时任务名称 */
private String baenName;
/** Bean名称 */
private Timestamp createTime;
/** cron表达式 */
private String cronExpression;
/** 异常详细 */
private String exceptionDetail;
/** 状态 */
private Boolean isSuccess;
/** 任务名称 */
private String jobName;
/** 方法名称 */
private String methodName;
/** 参数 */
private String params;
/** 耗时(毫秒) */
private Long time;
}

View File

@ -0,0 +1,13 @@
package co.yixiang.modules.quartz.service.dto;
import lombok.Data;
import java.util.List;
import co.yixiang.annotation.Query;
/**
* @author hupeng
* @date 2020-05-13
*/
@Data
public class QuartzLogQueryCriteria{
}

View File

@ -2,107 +2,110 @@ package co.yixiang.modules.quartz.service.impl;
import co.yixiang.exception.BadRequestException;
import co.yixiang.modules.quartz.domain.QuartzJob;
import co.yixiang.modules.quartz.domain.QuartzLog;
import co.yixiang.modules.quartz.service.QuartzJobService;
import co.yixiang.modules.quartz.service.dto.JobQueryCriteria;
import co.yixiang.common.service.impl.BaseServiceImpl;
import co.yixiang.modules.quartz.utils.QuartzManage;
import co.yixiang.utils.FileUtil;
import co.yixiang.utils.PageUtil;
import co.yixiang.utils.QueryHelp;
import co.yixiang.modules.shop.service.YxSystemStoreService;
import lombok.AllArgsConstructor;
import co.yixiang.dozer.service.IGenerator;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import co.yixiang.common.utils.QueryHelpPlus;
import co.yixiang.utils.ValidationUtil;
import co.yixiang.modules.quartz.repository.QuartzJobRepository;
import co.yixiang.modules.quartz.repository.QuartzLogRepository;
import org.quartz.CronExpression;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Pageable;
import co.yixiang.utils.FileUtil;
import co.yixiang.modules.quartz.service.QuartzJobService;
import co.yixiang.modules.quartz.service.dto.QuartzJobDto;
import co.yixiang.modules.quartz.service.dto.QuartzJobQueryCriteria;
import co.yixiang.modules.quartz.service.mapper.QuartzJobMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
// 默认不使用缓存
//import org.springframework.cache.annotation.CacheConfig;
//import org.springframework.cache.annotation.CacheEvict;
//import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import co.yixiang.utils.PageUtil;
import co.yixiang.utils.QueryHelp;
import java.util.List;
import java.util.Map;
import java.io.IOException;
import java.util.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.LinkedHashMap;
/**
* @author Zheng Jie
* @date 2019-01-07
*/
@Service(value = "quartzJobService")
@CacheConfig(cacheNames = "quartzJob")
* @author hupeng
* @date 2020-05-13
*/
@Service
@AllArgsConstructor
//@CacheConfig(cacheNames = "quartzJob")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class QuartzJobServiceImpl implements QuartzJobService {
private final QuartzJobRepository quartzJobRepository;
private final QuartzLogRepository quartzLogRepository;
public class QuartzJobServiceImpl extends BaseServiceImpl<QuartzJobMapper, QuartzJob> implements QuartzJobService {
private final IGenerator generator;
private final QuartzManage quartzManage;
public QuartzJobServiceImpl(QuartzJobRepository quartzJobRepository, QuartzLogRepository quartzLogRepository, QuartzManage quartzManage) {
this.quartzJobRepository = quartzJobRepository;
this.quartzLogRepository = quartzLogRepository;
this.quartzManage = quartzManage;
@Override
//@Cacheable
public Map<String, Object> queryAll(QuartzJobQueryCriteria criteria, Pageable pageable) {
getPage(pageable);
PageInfo<QuartzJob> page = new PageInfo<>(queryAll(criteria));
Map<String, Object> map = new LinkedHashMap<>(2);
map.put("content", generator.convert(page.getList(), QuartzJobDto.class));
map.put("totalElements", page.getTotal());
return map;
}
@Override
@Cacheable
public Object queryAll(JobQueryCriteria criteria, Pageable pageable){
return PageUtil.toPage(quartzJobRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable));
}
@Override
public Object queryAllLog(JobQueryCriteria criteria, Pageable pageable){
return PageUtil.toPage(quartzLogRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable));
//@Cacheable
public List<QuartzJob> queryAll(QuartzJobQueryCriteria criteria){
return baseMapper.selectList(QueryHelpPlus.getPredicate(QuartzJob.class, criteria));
}
@Override
public List<QuartzJob> queryAll(JobQueryCriteria criteria) {
return quartzJobRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder));
}
@Override
public List<QuartzLog> queryAllLog(JobQueryCriteria criteria) {
return quartzLogRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder));
}
@Override
@Cacheable(key = "#p0")
public QuartzJob findById(Long id) {
QuartzJob quartzJob = quartzJobRepository.findById(id).orElseGet(QuartzJob::new);
ValidationUtil.isNull(quartzJob.getId(),"QuartzJob","id",id);
return quartzJob;
}
@Override
@CacheEvict(allEntries = true)
@Transactional(rollbackFor = Exception.class)
public QuartzJob create(QuartzJob resources) {
if (!CronExpression.isValidExpression(resources.getCronExpression())){
throw new BadRequestException("cron表达式格式错误");
public void download(List<QuartzJobDto> all, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (QuartzJobDto quartzJob : all) {
Map<String,Object> map = new LinkedHashMap<>();
map.put("Spring Bean名称", quartzJob.getBeanName());
map.put("cron 表达式", quartzJob.getCronExpression());
map.put("状态1暂停、0启用", quartzJob.getIsPause());
map.put("任务名称", quartzJob.getJobName());
map.put("方法名称", quartzJob.getMethodName());
map.put("参数", quartzJob.getParams());
map.put("备注", quartzJob.getRemark());
map.put("创建日期", quartzJob.getCreateTime());
map.put("Spring Bean名称", quartzJob.getBeanName());
map.put("cron 表达式", quartzJob.getCronExpression());
map.put("状态1暂停、0启用", quartzJob.getIsPause());
map.put("任务名称", quartzJob.getJobName());
map.put("方法名称", quartzJob.getMethodName());
map.put("参数", quartzJob.getParams());
map.put("备注", quartzJob.getRemark());
map.put("创建日期", quartzJob.getCreateTime());
map.put("Spring Bean名称", quartzJob.getBeanName());
map.put("cron 表达式", quartzJob.getCronExpression());
map.put("状态1暂停、0启用", quartzJob.getIsPause());
map.put("任务名称", quartzJob.getJobName());
map.put("方法名称", quartzJob.getMethodName());
map.put("参数", quartzJob.getParams());
map.put("备注", quartzJob.getRemark());
map.put("创建日期", quartzJob.getCreateTime());
list.add(map);
}
resources = quartzJobRepository.save(resources);
quartzManage.addJob(resources);
return resources;
FileUtil.downloadExcel(list, response);
}
/**
* 更改定时任务状态
*
* @param quartzJob /
*/
@Override
@CacheEvict(allEntries = true)
@Transactional(rollbackFor = Exception.class)
public void update(QuartzJob resources) {
if(resources.getId().equals(1L)){
throw new BadRequestException("该任务不可操作");
}
if (!CronExpression.isValidExpression(resources.getCronExpression())){
throw new BadRequestException("cron表达式格式错误");
}
resources = quartzJobRepository.save(resources);
quartzManage.updateJobCron(resources);
}
@Override
@CacheEvict(allEntries = true)
public void updateIsPause(QuartzJob quartzJob) {
if(quartzJob.getId().equals(1L)){
throw new BadRequestException("该任务不可操作");
@ -114,9 +117,14 @@ public class QuartzJobServiceImpl implements QuartzJobService {
quartzManage.pauseJob(quartzJob);
quartzJob.setIsPause(true);
}
quartzJobRepository.save(quartzJob);
this.save(quartzJob);
}
/**
* 立即执行定时任务
*
* @param quartzJob /
*/
@Override
public void execution(QuartzJob quartzJob) {
if(quartzJob.getId().equals(1L)){
@ -125,54 +133,15 @@ public class QuartzJobServiceImpl implements QuartzJobService {
quartzManage.runJobNow(quartzJob);
}
/**
* 查询启用的任务
*
* @return List
*/
@Override
@CacheEvict(allEntries = true)
@Transactional(rollbackFor = Exception.class)
public void delete(Set<Long> ids) {
for (Long id : ids) {
if(id.equals(1L)){
throw new BadRequestException("更新访客记录不可删除,你可以在后台代码中取消该限制");
}
QuartzJob quartzJob = findById(id);
quartzManage.deleteJob(quartzJob);
quartzJobRepository.delete(quartzJob);
}
}
@Override
public void download(List<QuartzJob> quartzJobs, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (QuartzJob quartzJob : quartzJobs) {
Map<String,Object> map = new LinkedHashMap<>();
map.put("任务名称", quartzJob.getJobName());
map.put("Bean名称", quartzJob.getBeanName());
map.put("执行方法", quartzJob.getMethodName());
map.put("参数", quartzJob.getParams());
map.put("表达式", quartzJob.getCronExpression());
map.put("状态", quartzJob.getIsPause() ? "暂停中" : "运行中");
map.put("描述", quartzJob.getRemark());
map.put("创建日期", quartzJob.getCreateTime());
list.add(map);
}
FileUtil.downloadExcel(list, response);
}
@Override
public void downloadLog(List<QuartzLog> queryAllLog, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (QuartzLog quartzLog : queryAllLog) {
Map<String,Object> map = new LinkedHashMap<>();
map.put("任务名称", quartzLog.getJobName());
map.put("Bean名称", quartzLog.getBeanName());
map.put("执行方法", quartzLog.getMethodName());
map.put("参数", quartzLog.getParams());
map.put("表达式", quartzLog.getCronExpression());
map.put("异常详情", quartzLog.getExceptionDetail());
map.put("耗时/毫秒", quartzLog.getTime());
map.put("状态", quartzLog.getIsSuccess() ? "成功" : "失败");
map.put("创建日期", quartzLog.getCreateTime());
list.add(map);
}
FileUtil.downloadExcel(list, response);
public List<QuartzJob> findByIsPauseIsFalse() {
QuartzJobQueryCriteria criteria = new QuartzJobQueryCriteria();
criteria.setIsPause(false);
return baseMapper.selectList(QueryHelpPlus.getPredicate(QuartzJob.class, criteria));
}
}

View File

@ -0,0 +1,98 @@
package co.yixiang.modules.quartz.service.impl;
import co.yixiang.modules.quartz.domain.QuartzLog;
import co.yixiang.common.service.impl.BaseServiceImpl;
import lombok.AllArgsConstructor;
import co.yixiang.dozer.service.IGenerator;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import co.yixiang.common.utils.QueryHelpPlus;
import co.yixiang.utils.ValidationUtil;
import co.yixiang.utils.FileUtil;
import co.yixiang.modules.quartz.service.QuartzLogService;
import co.yixiang.modules.quartz.service.dto.QuartzLogDto;
import co.yixiang.modules.quartz.service.dto.QuartzLogQueryCriteria;
import co.yixiang.modules.quartz.service.mapper.QuartzLogMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
// 默认不使用缓存
//import org.springframework.cache.annotation.CacheConfig;
//import org.springframework.cache.annotation.CacheEvict;
//import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import co.yixiang.utils.PageUtil;
import co.yixiang.utils.QueryHelp;
import java.util.List;
import java.util.Map;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.LinkedHashMap;
/**
* @author hupeng
* @date 2020-05-13
*/
@Service
@AllArgsConstructor
//@CacheConfig(cacheNames = "quartzLog")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class QuartzLogServiceImpl extends BaseServiceImpl<QuartzLogMapper, QuartzLog> implements QuartzLogService {
private final IGenerator generator;
@Override
//@Cacheable
public Map<String, Object> queryAll(QuartzLogQueryCriteria criteria, Pageable pageable) {
getPage(pageable);
PageInfo<QuartzLog> page = new PageInfo<>(queryAll(criteria));
Map<String, Object> map = new LinkedHashMap<>(2);
map.put("content", generator.convert(page.getList(), QuartzLogDto.class));
map.put("totalElements", page.getTotal());
return map;
}
@Override
//@Cacheable
public List<QuartzLog> queryAll(QuartzLogQueryCriteria criteria){
return baseMapper.selectList(QueryHelpPlus.getPredicate(QuartzLog.class, criteria));
}
/**
* 导出数据
*
* @param all 待导出的数据
* @param response /
* @throws IOException /
*/
@Override
public void download(List<QuartzLogDto> all, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (QuartzLogDto quartzLog : all) {
Map<String,Object> map = new LinkedHashMap<>();
map.put(" baenName", quartzLog.getBaenName());
map.put(" createTime", quartzLog.getCreateTime());
map.put(" cronExpression", quartzLog.getCronExpression());
map.put(" exceptionDetail", quartzLog.getExceptionDetail());
map.put(" isSuccess", quartzLog.getIsSuccess());
map.put(" jobName", quartzLog.getJobName());
map.put(" methodName", quartzLog.getMethodName());
map.put(" params", quartzLog.getParams());
map.put(" time", quartzLog.getTime());
map.put("任务名称", quartzLog.getBaenName());
map.put("Bean名称 ", quartzLog.getCreateTime());
map.put("cron表达式", quartzLog.getCronExpression());
map.put("异常详细 ", quartzLog.getExceptionDetail());
map.put("状态", quartzLog.getIsSuccess());
map.put("任务名称", quartzLog.getJobName());
map.put("方法名称", quartzLog.getMethodName());
map.put("参数", quartzLog.getParams());
map.put("耗时(毫秒)", quartzLog.getTime());
list.add(map);
}
FileUtil.downloadExcel(list, response);
}
}

View File

@ -0,0 +1,16 @@
package co.yixiang.modules.quartz.service.mapper;
import co.yixiang.common.mapper.CoreMapper;
import co.yixiang.modules.quartz.domain.QuartzJob;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* @author hupeng
* @date 2020-05-13
*/
@Repository
@Mapper
public interface QuartzJobMapper extends CoreMapper<QuartzJob> {
}

View File

@ -0,0 +1,16 @@
package co.yixiang.modules.quartz.service.mapper;
import co.yixiang.common.mapper.CoreMapper;
import co.yixiang.modules.quartz.domain.QuartzLog;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* @author hupeng
* @date 2020-05-13
*/
@Repository
@Mapper
public interface QuartzLogMapper extends CoreMapper<QuartzLog> {
}

View File

@ -1,11 +1,11 @@
package co.yixiang.modules.quartz.utils;
import co.yixiang.config.thread.ThreadPoolExecutorUtil;
import co.yixiang.modules.quartz.domain.QuartzJob;
import co.yixiang.modules.quartz.service.QuartzLogService;
import co.yixiang.utils.SpringContextHolder;
import co.yixiang.utils.ThrowableUtil;
import co.yixiang.modules.quartz.domain.QuartzJob;
import co.yixiang.modules.quartz.domain.QuartzLog;
import co.yixiang.modules.quartz.repository.QuartzLogRepository;
import co.yixiang.modules.quartz.service.QuartzJobService;
import org.quartz.JobExecutionContext;
import org.slf4j.Logger;
@ -32,12 +32,12 @@ public class ExecutionJob extends QuartzJobBean {
protected void executeInternal(JobExecutionContext context) {
QuartzJob quartzJob = (QuartzJob) context.getMergedJobDataMap().get(QuartzJob.JOB_KEY);
// 获取spring bean
QuartzLogRepository quartzLogRepository = SpringContextHolder.getBean(QuartzLogRepository.class);
QuartzLogService quartzLogService = SpringContextHolder.getBean(QuartzLogService.class);
QuartzJobService quartzJobService = SpringContextHolder.getBean(QuartzJobService.class);
QuartzLog log = new QuartzLog();
log.setJobName(quartzJob.getJobName());
log.setBeanName(quartzJob.getBeanName());
log.setBaenName(quartzJob.getBeanName());
log.setMethodName(quartzJob.getMethodName());
log.setParams(quartzJob.getParams());
long startTime = System.currentTimeMillis();
@ -65,7 +65,7 @@ public class ExecutionJob extends QuartzJobBean {
//更新状态
quartzJobService.updateIsPause(quartzJob);
} finally {
quartzLogRepository.save(log);
quartzLogService.save(log);
}
}
}

View File

@ -1,8 +1,8 @@
package co.yixiang.modules.quartz.utils;
import co.yixiang.exception.BadRequestException;
import lombok.extern.slf4j.Slf4j;
import co.yixiang.modules.quartz.domain.QuartzJob;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.stereotype.Component;