fix(新增): 添加Quarter

This commit is contained in:
Bunny 2024-10-14 20:54:54 +08:00
parent 1eea81ead4
commit 837de6ae10
17 changed files with 472 additions and 39 deletions

View File

@ -20,7 +20,7 @@ public class AdminCodeGenerator {
public static final String entity = "Bunny"; public static final String entity = "Bunny";
public static void main(String[] args) { public static void main(String[] args) {
Generation("sys_files"); Generation("v_schedulers");
} }
/** /**
@ -51,7 +51,7 @@ public class AdminCodeGenerator {
.strategyConfig(builder -> { .strategyConfig(builder -> {
// 设置要生成的表名 // 设置要生成的表名
builder.addInclude(tableName) builder.addInclude(tableName)
.addTablePrefix("sys_") .addTablePrefix("sys_", "v_")
.entityBuilder() .entityBuilder()
.enableLombok() .enableLombok()
.enableChainModel() .enableChainModel()

View File

@ -3,11 +3,11 @@ package cn.bunny.common.generator.generator;
import cn.bunny.common.generator.entity.BaseField; import cn.bunny.common.generator.entity.BaseField;
import cn.bunny.common.generator.entity.BaseResultMap; import cn.bunny.common.generator.entity.BaseResultMap;
import cn.bunny.common.generator.utils.GeneratorCodeUtils; import cn.bunny.common.generator.utils.GeneratorCodeUtils;
import cn.bunny.dao.dto.system.email.EmailTemplateAddDto; import cn.bunny.dao.dto.schedulers.SchedulersAddDto;
import cn.bunny.dao.dto.system.email.EmailTemplateDto; import cn.bunny.dao.dto.schedulers.SchedulersDto;
import cn.bunny.dao.dto.system.email.EmailTemplateUpdateDto; import cn.bunny.dao.dto.schedulers.SchedulersUpdateDto;
import cn.bunny.dao.entity.system.EmailTemplate; import cn.bunny.dao.entity.view.Schedulers;
import cn.bunny.dao.vo.system.email.EmailTemplateVo; import cn.bunny.dao.vo.schedulers.SchedulersVo;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.google.common.base.CaseFormat; import com.google.common.base.CaseFormat;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@ -51,11 +51,11 @@ public class WebGeneratorCode {
public static String resourceMapperPath = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service\\src\\main\\resources\\mapper\\"; public static String resourceMapperPath = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service\\src\\main\\resources\\mapper\\";
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
Class<?> originalClass = EmailTemplate.class; Class<?> originalClass = Schedulers.class;
Class<?> dtoClass = EmailTemplateDto.class; Class<?> dtoClass = SchedulersDto.class;
Class<?> addDtoClass = EmailTemplateAddDto.class; Class<?> addDtoClass = SchedulersAddDto.class;
Class<?> updateDtoClass = EmailTemplateUpdateDto.class; Class<?> updateDtoClass = SchedulersUpdateDto.class;
Class<?> voClass = EmailTemplateVo.class; Class<?> voClass = SchedulersVo.class;
// 设置velocity资源加载器 // 设置velocity资源加载器
Properties prop = new Properties(); Properties prop = new Properties();

View File

@ -0,0 +1,55 @@
package cn.bunny.dao.dto.schedulers;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "SchedulersAddDto对象", title = "Schedulers添加表单", description = "Schedulers添加表单")
public class SchedulersAddDto {
@Schema(name = "jobName", title = "任务名称")
@NotBlank(message = "任务名称不能为空")
@NotNull(message = "任务名称不能为空")
private String jobName;
@Schema(name = "jobGroup", title = "任务分组")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String jobGroup;
@Schema(name = "description", title = "任务详情")
@NotBlank(message = "任务详情不能为空")
@NotNull(message = "任务详情不能为空")
private String description;
@Schema(name = "jobClassName", title = "任务类名称")
@NotBlank(message = "corn表达式不能为空")
@NotNull(message = "corn表达式不能为空")
private String jobClassName;
@Schema(name = "cronExpression", title = "corn表达式")
@NotBlank(message = "corn表达式不能为空")
@NotNull(message = "corn表达式不能为空")
private String cronExpression;
@Schema(name = "triggerName", title = "触发器名称")
@NotBlank(message = "触发器名称不能为空")
@NotNull(message = "触发器名称不能为空")
private String triggerName;
@Schema(name = "triggerState", title = "triggerState触发器状态")
@NotBlank(message = "triggerState触发器状态不能为空")
@NotNull(message = "triggerState触发器状态不能为空")
private String triggerState;
}

View File

@ -0,0 +1,37 @@
package cn.bunny.dao.dto.schedulers;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "SchedulersDto对象", title = "Schedulers查询表单", description = "Schedulers查询表单")
public class SchedulersDto {
@Schema(name = "jobName", title = "任务名称")
private String jobName;
@Schema(name = "jobGroup", title = "任务分组")
private String jobGroup;
@Schema(name = "description", title = "任务详情")
private String description;
@Schema(name = "jobClassName", title = "任务类名称")
@NotNull(message = "corn表达式不能为空")
private String jobClassName;
@Schema(name = "triggerName", title = "触发器名称")
private String triggerName;
@Schema(name = "triggerState", title = "triggerState触发器状态")
private String triggerState;
}

View File

@ -0,0 +1,57 @@
package cn.bunny.dao.dto.schedulers;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "SchedulersUpdateDto对象", title = "Schedulers更新表单", description = "Schedulers更新表单")
public class SchedulersUpdateDto {
@Schema(name = "id", title = "主键")
@NotNull(message = "id不能为空")
private Long id;
@Schema(name = "jobName", title = "任务名称")
@NotBlank(message = "任务名称不能为空")
@NotNull(message = "任务名称不能为空")
private String jobName;
@Schema(name = "jobGroup", title = "任务分组")
@NotBlank(message = "任务分组不能为空")
@NotNull(message = "任务分组不能为空")
private String jobGroup;
@Schema(name = "description", title = "任务详情")
@NotBlank(message = "任务详情不能为空")
@NotNull(message = "任务详情不能为空")
private String description;
@Schema(name = "jobClassName", title = "任务类名称")
@NotBlank(message = "corn表达式不能为空")
@NotNull(message = "corn表达式不能为空")
private String jobClassName;
@Schema(name = "cronExpression", title = "corn表达式")
@NotBlank(message = "corn表达式不能为空")
@NotNull(message = "corn表达式不能为空")
private String cronExpression;
@Schema(name = "triggerName", title = "触发器名称")
@NotBlank(message = "触发器名称不能为空")
@NotNull(message = "触发器名称不能为空")
private String triggerName;
@Schema(name = "triggerState", title = "triggerState触发器状态")
@NotBlank(message = "triggerState触发器状态不能为空")
@NotNull(message = "triggerState触发器状态不能为空")
private String triggerState;
}

View File

@ -0,0 +1,47 @@
package cn.bunny.dao.entity.view;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* VIEW
* </p>
*
* @author Bunny
* @since 2024-10-14
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("v_schedulers")
@Schema(name = "Schedulers对象", title = "Schedulers视图", description = "Schedulers视图")
public class Schedulers implements Serializable {
@Schema(name = "jobName", title = "任务名称")
private String jobName;
@Schema(name = "jobGroup", title = "任务分组")
private String jobGroup;
@Schema(name = "description", title = "任务详情")
private String description;
@Schema(name = "jobClassName", title = "任务类名称")
private String jobClassName;
@Schema(name = "cronExpression", title = "corn表达式")
private String cronExpression;
@Schema(name = "triggerName", title = "触发器名称")
private String triggerName;
@Schema(name = "triggerState", title = "triggerState触发器状态")
private String triggerState;
}

View File

@ -0,0 +1,36 @@
package cn.bunny.dao.vo.schedulers;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "SchedulersVo对象", title = "Schedulers返回内容", description = "Schedulers返回内容")
public class SchedulersVo {
@Schema(name = "jobName", title = "任务名称")
private String jobName;
@Schema(name = "jobGroup", title = "任务分组")
private String jobGroup;
@Schema(name = "description", title = "任务详情")
private String description;
@Schema(name = "jobClassName", title = "任务类名称")
@NotNull(message = "corn表达式不能为空")
private String jobClassName;
@Schema(name = "triggerName", title = "触发器名称")
private String triggerName;
@Schema(name = "triggerState", title = "triggerState触发器状态")
private String triggerState;
}

View File

@ -23,7 +23,7 @@ import java.util.Map;
/** /**
* <p> * <p>
* 邮件模板表表 前端控制器 * 邮件模板 前端控制器
* </p> * </p>
* *
* @author Bunny * @author Bunny
@ -37,7 +37,7 @@ public class EmailTemplateController {
@Autowired @Autowired
private EmailTemplateService emailTemplateService; private EmailTemplateService emailTemplateService;
@Operation(summary = "分页查询邮件模板", description = "分页查询邮件模板") @Operation(summary = "分页查询邮件模板", description = "分页查询邮件模板")
@GetMapping("getEmailTemplateList/{page}/{limit}") @GetMapping("getEmailTemplateList/{page}/{limit}")
public Mono<Result<PageResult<EmailTemplateVo>>> getEmailTemplateList( public Mono<Result<PageResult<EmailTemplateVo>>> getEmailTemplateList(
@Parameter(name = "page", description = "当前页", required = true) @Parameter(name = "page", description = "当前页", required = true)
@ -50,28 +50,28 @@ public class EmailTemplateController {
return Mono.just(Result.success(pageResult)); return Mono.just(Result.success(pageResult));
} }
@Operation(summary = "获取模板类型字段", description = "获取模板类型字段") @Operation(summary = "获取邮件模板类型字段", description = "获取邮件模板类型字段")
@GetMapping("getEmailTypes") @GetMapping("getEmailTypes")
public Mono<Result<List<Map<String, String>>>> getEmailTypes() { public Mono<Result<List<Map<String, String>>>> getEmailTypes() {
List<Map<String, String>> list = emailTemplateService.getEmailTypes(); List<Map<String, String>> list = emailTemplateService.getEmailTypes();
return Mono.just(Result.success(list)); return Mono.just(Result.success(list));
} }
@Operation(summary = "添加邮件模板", description = "添加邮件模板") @Operation(summary = "添加邮件模板", description = "添加邮件模板")
@PostMapping("addEmailTemplate") @PostMapping("addEmailTemplate")
public Mono<Result<String>> addEmailTemplate(@Valid @RequestBody EmailTemplateAddDto dto) { public Mono<Result<String>> addEmailTemplate(@Valid @RequestBody EmailTemplateAddDto dto) {
emailTemplateService.addEmailTemplate(dto); emailTemplateService.addEmailTemplate(dto);
return Mono.just(Result.success(ResultCodeEnum.ADD_SUCCESS)); return Mono.just(Result.success(ResultCodeEnum.ADD_SUCCESS));
} }
@Operation(summary = "更新邮件模板", description = "更新邮件模板") @Operation(summary = "更新邮件模板", description = "更新邮件模板")
@PutMapping("updateEmailTemplate") @PutMapping("updateEmailTemplate")
public Mono<Result<String>> updateEmailTemplate(@Valid @RequestBody EmailTemplateUpdateDto dto) { public Mono<Result<String>> updateEmailTemplate(@Valid @RequestBody EmailTemplateUpdateDto dto) {
emailTemplateService.updateEmailTemplate(dto); emailTemplateService.updateEmailTemplate(dto);
return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS)); return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS));
} }
@Operation(summary = "删除邮件模板", description = "删除邮件模板") @Operation(summary = "删除邮件模板", description = "删除邮件模板")
@DeleteMapping("deleteEmailTemplate") @DeleteMapping("deleteEmailTemplate")
public Mono<Result<String>> deleteEmailTemplate(@RequestBody List<Long> ids) { public Mono<Result<String>> deleteEmailTemplate(@RequestBody List<Long> ids) {
emailTemplateService.deleteEmailTemplate(ids); emailTemplateService.deleteEmailTemplate(ids);

View File

@ -0,0 +1,48 @@
package cn.bunny.services.controller;
import cn.bunny.dao.dto.schedulers.SchedulersAddDto;
import cn.bunny.dao.entity.view.Schedulers;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.pojo.result.Result;
import cn.bunny.services.service.SchedulersService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* VIEW 前端控制器
* </p>
*
* @author Bunny
* @since 2024-10-14
*/
@Tag(name = "定时任务", description = "定时任务相关接口")
@RestController
@RequestMapping("admin/schedulers")
public class SchedulersController {
@Autowired
private SchedulersService schedulersService;
@Operation(summary = "分页查询所有任务", description = "分页查询所有任务")
@PostMapping("getSchedulerList/{page}/{limit}")
public Result<PageResult<Schedulers>> getSchedulerList(
@Parameter(name = "page", description = "当前页", required = true)
@PathVariable("page") Integer page,
@Parameter(name = "limit", description = "每页记录数", required = true)
@PathVariable("limit") Integer limit) {
Page<Schedulers> pageParams = new Page<>(page, limit);
PageResult<Schedulers> pageResult = schedulersService.getSchedulerList(pageParams);
return Result.success(pageResult);
}
@Operation(summary = "添加任务", description = "添加任务")
@PostMapping("/addScheduler")
public Result<String> addScheduler(@RequestBody SchedulersAddDto dto) {
schedulersService.addScheduler(dto);
return Result.success();
}
}

View File

@ -0,0 +1,18 @@
package cn.bunny.services.mapper;
import cn.bunny.dao.entity.view.Schedulers;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* VIEW Mapper 接口
* </p>
*
* @author Bunny
* @since 2024-10-14
*/
@Mapper
public interface SchedulersMapper extends BaseMapper<Schedulers> {
}

View File

@ -0,0 +1,55 @@
package cn.bunny.services.quartz;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import java.io.IOException;
import java.util.Properties;
@Configuration
public class QuartzConfiguration {
@Autowired
private QuartzJobFactory quartzJobFactory;
/**
* 创建调度器工厂
* 1.创建SchedulerFactoryBean
* 2.加载自定义的quartz.properties配置文件
* 3.设置MyJobFactory
*
* @return SchedulerFactoryBean
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
try {
factoryBean.setAutoStartup(true);
// 延时3秒启动
factoryBean.setStartupDelay(3);
factoryBean.setQuartzProperties(quartzProperties());
factoryBean.setJobFactory(quartzJobFactory);
return factoryBean;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Bean
public Properties quartzProperties() throws IOException {
PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
propertiesFactoryBean.afterPropertiesSet();
return propertiesFactoryBean.getObject();
}
@Bean(name = "scheduler")
public Scheduler scheduler() {
return schedulerFactoryBean().getScheduler();
}
}

View File

@ -0,0 +1,28 @@
package cn.bunny.services.quartz;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class QuartzJobFactory extends AdaptableJobFactory {
// 这个对象Spring会帮我们自动注入进来
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
// 重写创建Job任务的实例方法
@NotNull
@Override
protected Object createJobInstance(@NotNull TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
// 通过以下方式解决Job任务无法使用Spring中的Bean问题
capableBeanFactory.autowireBean(jobInstance);
return super.createJobInstance(bundle);
}
}

View File

@ -0,0 +1,16 @@
package cn.bunny.services.service;
import cn.bunny.dao.entity.view.Schedulers;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* VIEW 服务类
* </p>
*
* @author Bunny
* @since 2024-10-14
*/
public interface SchedulersService extends IService<Schedulers> {
}

View File

@ -0,0 +1,20 @@
package cn.bunny.services.service.impl;
import cn.bunny.dao.entity.view.Schedulers;
import cn.bunny.services.mapper.SchedulersMapper;
import cn.bunny.services.service.SchedulersService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* VIEW 服务实现类
* </p>
*
* @author Bunny
* @since 2024-10-14
*/
@Service
public class SchedulersServiceImpl extends ServiceImpl<SchedulersMapper, Schedulers> implements SchedulersService {
}

View File

@ -48,27 +48,6 @@ spring:
wait-for-jobs-to-complete-on-shutdown: true wait-for-jobs-to-complete-on-shutdown: true
overwrite-existing-jobs: false overwrite-existing-jobs: false
scheduler-name: quartzScheduler scheduler-name: quartzScheduler
properties:
org:
quartz:
scheduler:
# 默认
instanceName: RedpigScheduler
# 如果使用集群instanceId必须唯一设置成AUTO
instanceId: AUTO
jobStore:
# 存储方式使用JobStoreTX 也就是数据库
class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 表名前缀
tablePrefix: QRTZ_
useProperties: false
misfireThreshold: 5000
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 20
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
jackson: jackson:
date-format: yyyy-MM-dd HH:mm:ss date-format: yyyy-MM-dd HH:mm:ss

View File

@ -0,0 +1,21 @@
<?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="cn.bunny.services.mapper.SchedulersMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.bunny.dao.entity.view.Schedulers">
<result column="job_name" property="jobName"/>
<result column="job_group" property="jobGroup"/>
<result column="description" property="description"/>
<result column="job_class_name" property="jobClassName"/>
<result column="cron_expression" property="cronExpression"/>
<result column="trigger_name" property="triggerName"/>
<result column="trigger_state" property="triggerState"/>
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
job_name, job_group, description, job_class_name, cron_expression, trigger_name, trigger_state
</sql>
</mapper>

View File

@ -0,0 +1,16 @@
org.quartz.scheduler.instanceName=quartzScheduler
org.quartz.scheduler.instanceId=AUTO
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=20
org.quartz.threadPool.threadPriority=5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.dataSource=auth_admin
org.quartz.jobStore.misfireThreshold=5000
org.quartz.dataSource.auth_admin.driver=com.mysql.cj.jdbc.Driver
org.quartz.dataSource.auth_admin.URL=jdbc:mysql://192.168.3.98:3306/auth_admin?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true
org.quartz.dataSource.auth_admin.user=root
org.quartz.dataSource.auth_admin.password=02120212
org.quartz.dataSource.auth_admin.maxConnections=5