2019做网站seo行不行布吉网站建设公司

当前位置: 首页 > news >正文

2019做网站seo行不行,布吉网站建设公司,wordpress到服务器配置,专做茶叶的网站参考了若依框架#xff0c;将quartz定时任务框架集成到自己的项目当中。 目录 一、Quartz概述二、库表创建1.Quartz关键表#xff08;11张#xff09;表SQL 2.自定义业务表#xff08;2张#xff09;表SQL 三、代码示例1.依赖引入2.类文件1#xff09;定时任务配置类2将quartz定时任务框架集成到自己的项目当中。 目录 一、Quartz概述二、库表创建1.Quartz关键表11张表SQL 2.自定义业务表2张表SQL 三、代码示例1.依赖引入2.类文件1定时任务配置类2定时任务工具类3定时任务调度类4定时任务业务类 四、难题参考文章 一、Quartz概述 Quartz是一个开源的、功能强大的、可插拔的任务调度框架能在Java应用程序中实现定时任务的创建和执行广泛应用于各种需要定时或周期性执行人物的场景。 Quartz的主要特点 灵活性支持多种触发器类型延迟触发、固定时间间隔触发、基于日历的复杂触发模式允许开发者根据需求定制任务的执行频率和时间。持久性可以将任务和触发器的状态保存在数据库中即使应用重启也能回复之前的状态继续执行任务。集群支持在集群环境中可以保证任务的正确分发和执行避免重复执行或漏执行的情况。插件架构采用插件架构涉及使得扩展和定制变得容易。开发者可以根据需要添加自定义的插件来增加架构的功能。跨平台Quartz是纯Java编写的因此可以在任务支持Java的平台上运行包括Window、Linux、Unix等。 二、库表创建 1.Quartz关键表11张 Quartz在数据库中创建了一系列表来存储任务调度相关的信息包括job的详细信息、触发器的信息等。 表名备注qrtz_blob_triggers存储以Blob类型存储的触发器信息表qrtz_calendars日历信息表用于指定一个时间范围qrtz_cron_triggers存储以Cron类型存储的触发器信息表Cron触发器则根据Cron表达式来触发qrtz_fired_triggers存储已触发的触发器表qrtz_job_details任务详细信息表这个表存储了每个Job的详细信息包括Job的名称、描述、组名、类名等。这些信息是调度器调度Job的基础。qrtz_locks存储的悲观锁信息表如果使用了悲观锁qrtz_paused_trigger_grps存储暂停掉的触发器信息表表qrtz_scheduler_state存储调度器状态表qrtz_simple_triggers存储简单触发器的信息表简单触发器在指定的间隔后触发qrtz_simprop_triggers同步机制的行锁表qrtz_triggers存储触发器详细信息表包括触发器的名称、组名、触发器的类型、开始时间、结束时间等。 表SQL CREATE TABLE QRTZ_JOB_DETAILS(SCHED_NAME VARCHAR(120) NOT NULL,JOB_NAME VARCHAR(200) NOT NULL,JOB_GROUP VARCHAR(200) NOT NULL,DESCRIPTION VARCHAR(250) NULL,JOB_CLASS_NAME VARCHAR(250) NOT NULL,IS_DURABLE VARCHAR(1) NOT NULL,IS_NONCONCURRENT VARCHAR(1) NOT NULL,IS_UPDATE_DATA VARCHAR(1) NOT NULL,REQUESTS_RECOVERY VARCHAR(1) NOT NULL,JOB_DATA BLOB NULL,PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) );CREATE TABLE QRTZ_TRIGGERS(SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_NAME VARCHAR(200) NOT NULL,TRIGGER_GROUP VARCHAR(200) NOT NULL,JOB_NAME VARCHAR(200) NOT NULL,JOB_GROUP VARCHAR(200) NOT NULL,DESCRIPTION VARCHAR(250) NULL,NEXT_FIRE_TIME BIGINT(13) NULL,PREV_FIRE_TIME BIGINT(13) NULL,PRIORITY INTEGER NULL,TRIGGER_STATE VARCHAR(16) NOT NULL,TRIGGER_TYPE VARCHAR(8) NOT NULL,START_TIME BIGINT(13) NOT NULL,END_TIME BIGINT(13) NULL,CALENDAR_NAME VARCHAR(200) NULL,MISFIRE_INSTR SMALLINT(2) NULL,JOB_DATA BLOB NULL,PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) );CREATE TABLE QRTZ_SIMPLE_TRIGGERS(SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_NAME VARCHAR(200) NOT NULL,TRIGGER_GROUP VARCHAR(200) NOT NULL,REPEAT_COUNT BIGINT(7) NOT NULL,REPEAT_INTERVAL BIGINT(12) NOT NULL,TIMES_TRIGGERED BIGINT(10) NOT NULL,PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) );CREATE TABLE QRTZ_CRON_TRIGGERS(SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_NAME VARCHAR(200) NOT NULL,TRIGGER_GROUP VARCHAR(200) NOT NULL,CRON_EXPRESSION VARCHAR(200) NOT NULL,TIME_ZONE_ID VARCHAR(80),PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) );CREATE TABLE QRTZ_SIMPROP_TRIGGERS( SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_NAME VARCHAR(200) NOT NULL,TRIGGER_GROUP VARCHAR(200) NOT NULL,STR_PROP_1 VARCHAR(512) NULL,STR_PROP_2 VARCHAR(512) NULL,STR_PROP_3 VARCHAR(512) NULL,INT_PROP_1 INT NULL,INT_PROP_2 INT NULL,LONG_PROP_1 BIGINT NULL,LONG_PROP_2 BIGINT NULL,DEC_PROP_1 NUMERIC(13,4) NULL,DEC_PROP_2 NUMERIC(13,4) NULL,BOOL_PROP_1 VARCHAR(1) NULL,BOOL_PROP_2 VARCHAR(1) NULL,PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) );CREATE TABLE QRTZ_BLOB_TRIGGERS(SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_NAME VARCHAR(200) NOT NULL,TRIGGER_GROUP VARCHAR(200) NOT NULL,BLOB_DATA BLOB NULL,PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) );CREATE TABLE QRTZ_CALENDARS(SCHED_NAME VARCHAR(120) NOT NULL,CALENDAR_NAME VARCHAR(200) NOT NULL,CALENDAR BLOB NOT NULL,PRIMARY KEY (SCHED_NAME,CALENDAR_NAME) );CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS(SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_GROUP VARCHAR(200) NOT NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP) );CREATE TABLE QRTZ_FIRED_TRIGGERS(SCHED_NAME VARCHAR(120) NOT NULL,ENTRY_ID VARCHAR(95) NOT NULL,TRIGGER_NAME VARCHAR(200) NOT NULL,TRIGGER_GROUP VARCHAR(200) NOT NULL,INSTANCE_NAME VARCHAR(200) NOT NULL,FIRED_TIME BIGINT(13) NOT NULL,SCHED_TIME BIGINT(13) NOT NULL,PRIORITY INTEGER NOT NULL,STATE VARCHAR(16) NOT NULL,JOB_NAME VARCHAR(200) NULL,JOB_GROUP VARCHAR(200) NULL,IS_NONCONCURRENT VARCHAR(1) NULL,REQUESTS_RECOVERY VARCHAR(1) NULL,PRIMARY KEY (SCHED_NAME,ENTRY_ID) );CREATE TABLE QRTZ_SCHEDULER_STATE(SCHED_NAME VARCHAR(120) NOT NULL,INSTANCE_NAME VARCHAR(200) NOT NULL,LAST_CHECKIN_TIME BIGINT(13) NOT NULL,CHECKIN_INTERVAL BIGINT(13) NOT NULL,PRIMARY KEY (SCHED_NAME,INSTANCE_NAME) );CREATE TABLE QRTZ_LOCKS(SCHED_NAME VARCHAR(120) NOT NULL,LOCK_NAME VARCHAR(40) NOT NULL, PRIMARY KEY (SCHED_NAME,LOCK_NAME) ); 2.自定义业务表2张 通过自定义业务表操作定时任务框架的执行状态和记录定时任务执行日志。 表名备注sys_cron_job定时任务调度表sys_cron_job_log定时任务调度日志表 表SQL CREATE TABLE sys_job (job_id bigint NOT NULL AUTO_INCREMENT COMMENT 任务ID,job_name varchar(64) COLLATE utf8mb4_general_ci NOT NULL DEFAULT COMMENT 任务名称,job_group varchar(64) COLLATE utf8mb4_general_ci NOT NULL DEFAULT DEFAULT COMMENT 任务组名,invoke_target varchar(500) COLLATE utf8mb4_general_ci NOT NULL COMMENT 调用目标字符串,cron_expression varchar(255) COLLATE utf8mb4_general_ci DEFAULT COMMENT cron执行表达式,misfire_policy varchar(20) COLLATE utf8mb4_general_ci DEFAULT 3 COMMENT 计划执行错误策略1立即执行 2执行一次 3放弃执行,concurrent char(1) COLLATE utf8mb4_general_ci DEFAULT 1 COMMENT 是否并发执行0允许 1禁止,status char(1) COLLATE utf8mb4_general_ci DEFAULT 0 COMMENT 状态0正常 1暂停,create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT COMMENT 创建者,create_time datetime DEFAULT NULL COMMENT 创建时间,update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT COMMENT 更新者,update_time datetime DEFAULT NULL COMMENT 更新时间,remark varchar(500) COLLATE utf8mb4_general_ci DEFAULT COMMENT 备注信息,PRIMARY KEY (job_id,job_name,job_group) ) ENGINEInnoDB AUTO_INCREMENT100 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci COMMENT定时任务调度表;CREATE TABLE sys_job_log (job_log_id bigint NOT NULL AUTO_INCREMENT COMMENT 任务日志ID,job_name varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT 任务名称,job_group varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT 任务组名,invoke_target varchar(500) COLLATE utf8mb4_general_ci NOT NULL COMMENT 调用目标字符串,job_message varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 日志信息,status char(1) COLLATE utf8mb4_general_ci DEFAULT 0 COMMENT 执行状态0正常 1失败,exception_info varchar(2000) COLLATE utf8mb4_general_ci DEFAULT COMMENT 异常信息,create_time datetime DEFAULT NULL COMMENT 创建时间,PRIMARY KEY (job_log_id) ) ENGINEInnoDB AUTO_INCREMENT6 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci COMMENT定时任务调度日志表;三、代码示例 1.依赖引入 !– quartz –dependencygroupIdorg.quartz-scheduler/groupIdartifactIdquartz/artifactIdversion2.2.3/version/dependencydependencygroupIdorg.quartz-scheduler/groupIdartifactIdquartz-jobs/artifactIdversion2.2.3/version/dependency 2.类文件 需要将ruoyi-quartz中的以下所有类文件移植到自己的项目中
1定时任务配置类 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.quartz.SchedulerFactoryBean;import javax.sql.DataSource; import java.util.Properties;/*** 定时任务配置单机部署建议默认走内存如需集群需要创建qrtz数据库表/打开类注释** author ruoyi*/ Configuration public class ScheduleConfig {Beanpublic SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource){SchedulerFactoryBean factory new SchedulerFactoryBean();factory.setDataSource(dataSource);// quartz参数Properties prop new Properties();// 修改为对应名称prop.put(org.quartz.scheduler.instanceName, RuoyiScheduler);prop.put(org.quartz.scheduler.instanceId, AUTO);// 线程池配置prop.put(org.quartz.threadPool.class, org.quartz.simpl.SimpleThreadPool);prop.put(org.quartz.threadPool.threadCount, 20);prop.put(org.quartz.threadPool.threadPriority, 5);// JobStore配置prop.put(org.quartz.jobStore.class, org.springframework.scheduling.quartz.LocalDataSourceJobStore);// 集群配置prop.put(org.quartz.jobStore.isClustered, true);prop.put(org.quartz.jobStore.clusterCheckinInterval, 15000);prop.put(org.quartz.jobStore.maxMisfiresToHandleAtATime, 10);prop.put(org.quartz.jobStore.txIsolationLevelSerializable, true);// sqlserver 启用// prop.put(org.quartz.jobStore.selectWithLockSQL, SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCKNAME ?);prop.put(org.quartz.jobStore.misfireThreshold, 12000);prop.put(org.quartz.jobStore.tablePrefix, QRTZ);factory.setQuartzProperties(prop);// 修改为对应名称factory.setSchedulerName(RuoyiScheduler);// 延时启动factory.setStartupDelay(1);factory.setApplicationContextSchedulerContextKey(applicationContextKey);// 可选QuartzScheduler// 启动时更新己存在的Job这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了factory.setOverwriteExistingJobs(true);// 设置自动启动默认为truefactory.setAutoStartup(true);return factory;} } 2定时任务工具类 import cn.ffcs.up.rbac.constants.ScheduleConstants; import cn.ffcs.up.rbac.entity.TsCronJob;import cn.ffcs.up.rbac.job.TaskException;import org.quartz.;/** 定时任务工具类* * author ruoyi/ public class ScheduleUtils {/* 定时任务白名单配置仅允许访问的包名如其他需要可以自行添加/public static final String[] JOB_WHITELIST_STR { cn.ffcs.up.rbac.task };/** 定时任务违规的字符/public static final String[] JOB_ERROR_STR { java.net.URL, javax.naming.InitialContext, org.yaml.snakeyaml,org.springframework, org.apache };/** 得到quartz任务类** param sysJob 执行计划* return 具体执行任务类/private static Class? extends Job getQuartzJobClass(TsCronJob sysJob){boolean isConcurrent 0.equals(sysJob.getConcurrent());return isConcurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class;}/** 构建任务触发对象/public static TriggerKey getTriggerKey(Long jobId, String jobGroup){return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME jobId, jobGroup);}/** 构建任务键对象/public static JobKey getJobKey(Long jobId, String jobGroup){return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME jobId, jobGroup);}/** 创建定时任务/public static void createScheduleJob(Scheduler scheduler, TsCronJob job) throws SchedulerException, TaskException{Class? extends Job jobClass getQuartzJobClass(job);// 构建job信息Long jobId job.getJobId();String jobGroup job.getJobGroup();JobDetail jobDetail JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build();// 表达式调度构建器CronScheduleBuilder cronScheduleBuilder CronScheduleBuilder.cronSchedule(job.getCronExpression());cronScheduleBuilder handleCronScheduleMisfirePolicy(job, cronScheduleBuilder);// 按新的cronExpression表达式构建一个新的triggerCronTrigger trigger TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)).withSchedule(cronScheduleBuilder).build();// 放入参数运行时的方法可以获取jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job);// 分布式数据库需要给trigger的jobdata设置默认值trigger.getJobDataMap().put(ScheduleConstants.TRIGGER_DEFAULT, TRIGGER_DEFAULT);// 判断是否存在if (scheduler.checkExists(getJobKey(jobId, jobGroup))){// 防止创建时存在数据问题 先移除然后在执行创建操作scheduler.deleteJob(getJobKey(jobId, jobGroup));}// 判断任务是否过期if (StringUtils.isNotNull(CronUtils.getNextExecution(job.getCronExpression()))){// 执行调度任务scheduler.scheduleJob(jobDetail, trigger);}// 暂停任务if (job.getExecutionStatus().equals(ScheduleConstants.Status.PAUSE.getValue())){scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));}}/** 设置定时任务策略/public static CronScheduleBuilder handleCronScheduleMisfirePolicy(TsCronJob job, CronScheduleBuilder cb)throws TaskException{switch (job.getMisfirePolicy()){case ScheduleConstants.MISFIRE_DEFAULT:return cb;case ScheduleConstants.MISFIRE_IGNORE_MISFIRES:return cb.withMisfireHandlingInstructionIgnoreMisfires();case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED:return cb.withMisfireHandlingInstructionFireAndProceed();case ScheduleConstants.MISFIRE_DO_NOTHING:return cb.withMisfireHandlingInstructionDoNothing();default:throw new TaskException(The task misfire policy job.getMisfirePolicy() cannot be used in cron schedule tasks, TaskException.Code.CONFIG_ERROR);}}/** 检查包名是否为白名单配置* * param invokeTarget 目标字符串* return 结果/public static boolean whiteList(String invokeTarget){String packageName StringUtils.substringBefore(invokeTarget, ();int count StringUtils.countMatches(packageName, .);if (count 1){return StringUtils.containsAnyIgnoreCase(invokeTarget, JOB_WHITELIST_STR);}Object obj CloudAdminUtils.getBean(StringUtils.split(invokeTarget, .)[0]);String beanPackageName obj.getClass().getPackage().getName();return StringUtils.containsAnyIgnoreCase(beanPackageName, JOB_WHITELIST_STR) !StringUtils.containsAnyIgnoreCase(beanPackageName, JOB_ERROR_STR);} } 3定时任务调度类 import org.springframework.stereotype.Component; import com.ruoyi.common.utils.StringUtils;/** 定时任务调度测试* * author ruoyi/ Component(ryTask) public class RyTask {public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i){System.out.println(StringUtils.format(执行多参方法 字符串类型{}布尔类型{}长整型{}浮点型{}整形{}, s, b, l, d, i));}public void ryParams(String params){System.out.println(执行有参方法 params);}public void ryNoParams(){System.out.println(执行无参方法);} }4定时任务业务类 import java.util.List; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.exception.job.TaskException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.quartz.domain.SysJob; import com.ruoyi.quartz.service.ISysJobService; import com.ruoyi.quartz.util.CronUtils; import com.ruoyi.quartz.util.ScheduleUtils;/*** 调度任务信息操作处理* * author ruoyi/ Controller RequestMapping(/monitor/job) public class SysJobController extends BaseController {private String prefix monitor/job;Autowiredprivate ISysJobService jobService;RequiresPermissions(monitor:job:view)GetMapping()public String job(){return prefix /job;}RequiresPermissions(monitor:job:list)PostMapping(/list)ResponseBodypublic TableDataInfo list(SysJob job){startPage();ListSysJob list jobService.selectJobList(job);return getDataTable(list);}Log(title 定时任务, businessType BusinessType.EXPORT)RequiresPermissions(monitor:job:export)PostMapping(/export)ResponseBodypublic AjaxResult export(SysJob job){ListSysJob list jobService.selectJobList(job);ExcelUtilSysJob util new ExcelUtilSysJob(SysJob.class);return util.exportExcel(list, 定时任务);}Log(title 定时任务, businessType BusinessType.DELETE)RequiresPermissions(monitor:job:remove)PostMapping(/remove)ResponseBodypublic AjaxResult remove(String ids) throws SchedulerException{jobService.deleteJobByIds(ids);return success();}RequiresPermissions(monitor:job:detail)GetMapping(/detail/{jobId})public String detail(PathVariable(jobId) Long jobId, ModelMap mmap){mmap.put(name, job);mmap.put(job, jobService.selectJobById(jobId));return prefix /detail;}/** 任务调度状态修改/Log(title 定时任务, businessType BusinessType.UPDATE)RequiresPermissions(monitor:job:changeStatus)PostMapping(/changeStatus)ResponseBodypublic AjaxResult changeStatus(SysJob job) throws SchedulerException{SysJob newJob jobService.selectJobById(job.getJobId());newJob.setStatus(job.getStatus());return toAjax(jobService.changeStatus(newJob));}/** 任务调度立即执行一次/Log(title 定时任务, businessType BusinessType.UPDATE)RequiresPermissions(monitor:job:changeStatus)PostMapping(/run)ResponseBodypublic AjaxResult run(SysJob job) throws SchedulerException{boolean result jobService.run(job);return result ? success() : error(任务不存在或已过期);}/** 新增调度/GetMapping(/add)public String add(){return prefix /add;}/** 新增保存调度/Log(title 定时任务, businessType BusinessType.INSERT) // RequiresPermissions(monitor:job:add)PostMapping(/add)ResponseBodypublic AjaxResult addSave(Validated RequestBody SysJob job) throws SchedulerException, TaskException{if (!CronUtils.isValid(job.getCronExpression())){return error(新增任务 job.getJobName() 失败Cron表达式不正确);}else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)){return error(新增任务 job.getJobName() 失败目标字符串不允许rmi调用);}else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })){return error(新增任务 job.getJobName() 失败目标字符串不允许ldap(s)调用);}else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })){return error(新增任务 job.getJobName() 失败目标字符串不允许http(s)调用);}else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)){return error(新增任务 job.getJobName() 失败目标字符串存在违规);}else if (!ScheduleUtils.whiteList(job.getInvokeTarget())){return error(新增任务 job.getJobName() 失败目标字符串不在白名单内);}job.setCreateBy(0);return toAjax(jobService.insertJob(job));}/** 修改调度/RequiresPermissions(monitor:job:edit)GetMapping(/edit/{jobId})public String edit(PathVariable(jobId) Long jobId, ModelMap mmap){mmap.put(job, jobService.selectJobById(jobId));return prefix /edit;}/** 修改保存调度/Log(title 定时任务, businessType BusinessType.UPDATE)RequiresPermissions(monitor:job:edit)PostMapping(/edit)ResponseBodypublic AjaxResult editSave(Validated SysJob job) throws SchedulerException, TaskException{if (!CronUtils.isValid(job.getCronExpression())){return error(修改任务 job.getJobName() 失败Cron表达式不正确);}else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)){return error(修改任务 job.getJobName() 失败目标字符串不允许rmi调用);}else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })){return error(修改任务 job.getJobName() 失败目标字符串不允许ldap调用);}else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })){return error(修改任务 job.getJobName() 失败目标字符串不允许http(s)调用);}else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)){return error(修改任务 job.getJobName() 失败目标字符串存在违规);}else if (!ScheduleUtils.whiteList(job.getInvokeTarget())){return error(修改任务 job.getJobName() 失败目标字符串不在白名单内);}return toAjax(jobService.updateJob(job));}/** 校验cron表达式是否有效/PostMapping(/checkCronExpressionIsValid)ResponseBodypublic boolean checkCronExpressionIsValid(SysJob job){return jobService.checkCronExpressionIsValid(job.getCronExpression());}/** Cron表达式在线生成/GetMapping(/cron)public String cron(){return prefix /cron;}/** 查询cron表达式近5次的执行时间*/GetMapping(/queryCronExpression)ResponseBodypublic AjaxResult queryCronExpression(RequestParam(value cronExpression, required false) String cronExpression){if (jobService.checkCronExpressionIsValid(cronExpression)){ListString dateList CronUtils.getRecentTriggerTime(cronExpression);return success(dateList);}else{return error(表达式无效);}} } 四、难题 在通过接口创建定时任务时有碰到一个报错Unknown column ‘0x’ in ‘field list’。 经过debug确认是插入qrtz_triggers表时报错的。 INSERT INTO QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, JOB_NAME, JOB_GROUP, DESCRIPTION, NEXT_FIRE_TIME, PREV_FIRE_TIME, TRIGGER_STATE, TRIGGER_TYPE, START_TIME, END_TIME, CALENDAR_NAME, MISFIRE_INSTR, JOB_DATA, PRIORITY) VALUES(CustomerScheduler, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)原本以为是字段类型的问题尝试更改了数据格式但是没有生效。经过排查发现是是qrtz_trigger表中的job_data插入的数据为空导致的报错。 因为博主的项目的数据库是分布式数据库会导致插入报错。于是在执行调度任务前给job_data字段默认设置了值不是空就不会出现0x可以添加成功了。 // 分布式数据库需要给trigger的jobdata设置默认值trigger.getJobDataMap().put(ScheduleConstants.TRIGGER_DEFAULT, TRIGGER_DEFAULT);参考文章 Ruoyi-Cloud 【疑难】Unknown column ‘0x’ in ‘field list’ SpringbootQuartzdruid多库