@Configuration
public class ScheduleConfig {
@Bean
public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setDataSource(dataSource);
// quartz参数
Properties prop = new Properties();
prop.put(“org.quartz.scheduler.instanceName”, “QUARTZ”);
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.quartz.impl.jdbcjobstore.JobStoreTX”);
// 集群配置
prop.put(“org.quartz.jobStore.isClustered”, “true”);
prop.put(“org.quartz.jobStore.clusterCheckinInterval”, “15000”);
prop.put(“org.quartz.jobStore.maxMisfiresToHandleAtATime”, “1”);
prop.put(“org.quartz.jobStore.txIsolationLevelSerializable”, “true”);
// sqlserver 启用
prop.put(“org.quartz.jobStore.misfireThreshold”, “12000”);
prop.put(“org.quartz.jobStore.tablePrefix”, “QRTZ_”);
factory.setQuartzProperties(prop);
factory.setSchedulerName(“QUARTZ”);
// 延时启动
factory.setStartupDelay(1);
factory.setApplicationContextSchedulerContextKey(“applicationContextKey”);
// 可选,QuartzScheduler
// 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
factory.setOverwriteExistingJobs(true);
// 设置自动启动,默认为true
factory.setAutoStartup(true);
return factory;
}
}
3.业务类
主要是为页面提供接口。
@RestController
@RequestMapping(“/qrtzJob”)
public class QrtzJobController {
@Autowired
private QrtzJobService qrtzJobService;
/**
-
检查表达式
-
@param cron
-
@return
*/
@GetMapping(“/check”)
public boolean checkCron(String cron) {
try {
return CronExpression.isValidExpression(cron);
} catch (Exception e) {
return false;
}
}
/**
-
通过对象查询数据
-
@param qrtzJobVO 请求对象
-
@return 数据集合
*/
@GetMapping(“/selectQrtzJob”)
@ApiOperation(value = “通过实体查询”, notes = “通过实体查询”)
public Result<List>
selectQrtzJob(@ApiParam(name = “入参对象”, value = “实体”, required = false) QrtzJobVO qrtzJobVO) {
Result<List> resultVO = new Result<>();
// 业务查询
List resultListQrtzJob = qrtzJobService.queryQrtzJobAll(qrtzJobVO);
resultVO.setData(resultListQrtzJob);
return resultVO;
}
/**
-
通过对象增加数据
-
@param qrtzJobVO 请求对象
-
@return
*/
@PostMapping(“/createQrtzJob”)
@ApiOperation(value = “通过实体添加”, notes = “通过实体添加”)
public Result
createQrtzJob(@ApiParam(name = “入参对象”, value = “实体”, required = false) @RequestBody QrtzJobVO qrtzJobVO) {
Result resultVO = new Result();
// 业务处理
qrtzJobService.createScheduleJob(qrtzJobVO);
return resultVO;
}
/**
-
通过对象修改
-
@param qrtzJobVO 请求对象
-
@return
*/
@PutMapping(“/updateQrtzJob”)
@ApiOperation(value = “通过实体修改”, notes = “通过实体修改”)
public Result
updateQrtzJob(@ApiParam(name = “入参对象”, value = “实体”, required = false) @RequestBody QrtzJobVO qrtzJobVO) {
Result resultVO = new Result();
// 业务处理
qrtzJobService.updateScheduleJob(qrtzJobVO);
return resultVO;
}
/**
-
通过对象删除
-
@param qrtzJobVO 请求对象
-
@return
*/
@DeleteMapping(“/deleteQrtzJob”)
@ApiOperation(value = “通过实体删除”, notes = “通过实体删除”)
public Result
deleteQrtzJob(@ApiParam(name = “入参对象”, value = “实体”, required = false) @RequestBody QrtzJobVO qrtzJobVO) {
Result resultVO = new Result();
// 业务处理
qrtzJobService.deleteScheduleJob(qrtzJobVO);
return resultVO;
}
/**
-
运行定时任务
-
@param qrtzJobVO
-
@return
*/
@GetMapping(“/runJob”)
public Result
runJob(@ApiParam(name = “入参对象”, value = “实体”, required = false) @RequestBody List qrtzJobVO) {
Result resultVO = new Result();
// 业务处理
qrtzJobService.run(qrtzJobVO);
return resultVO;
}
/**
-
暂停定时任务
-
@param qrtzJobVO
-
@return
*/
@GetMapping(“/pauseJob”)
public Result
pauseJob(@ApiParam(name = “入参对象”, value = “实体”, required = false) @RequestBody List qrtzJobVO) {
Result resultVO = new Result();
// 业务处理
qrtzJobService.pause(qrtzJobVO);
return resultVO;
}
@GetMapping(“resumeJob”)
public Result
resumeJob(@ApiParam(name = “入参对象”, value = “实体”, required = false) @RequestBody List qrtzJobVO) {
Result resultVO = new Result();
// 业务处理
qrtzJobService.resume(qrtzJobVO);
return resultVO;
}
}
4.运行配置
ScheduleUtils:将新添加的trigger,jobDetail放入scheduler中。
public class ScheduleUtils {
private static final Logger log = LoggerFactory.getLogger(ScheduleUtils.class);
private static final String JOB_NAME_PREFIX = “TASK_”;
private static TriggerKey getTriggerKey(Long jobId) {
return TriggerKey.triggerKey(“TASK_” + jobId);
}
private static JobKey getJobKey(Long jobId) {
return JobKey.jobKey(“TASK_” + jobId);
}
public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
try {
return (CronTrigger)scheduler.getTrigger(getTriggerKey(jobId));
} catch (SchedulerException e) {
log.error(“获取Cron表达式失败”, e);
return null;
}
}
public static void createScheduleJob(Scheduler scheduler, QrtzJobVO scheduleJob) {
try {
JobDetail jobDetail = JobBuilder.newJob(com.job.util.ScheduleJob.class)
.withIdentity(getJobKey(scheduleJob.getJobId())).build();
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
.withMisfireHandlingInstructionDoNothing();
CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger()
.withIdentity(getTriggerKey(scheduleJob.getJobId())).withSchedule(scheduleBuilder).build();
jobDetail.getJobDataMap().put(“JOB_PARAM_KEY”, scheduleJob);
scheduler.scheduleJob(jobDetail, trigger);
if (scheduleJob.getStatus().equals(CommonConstant.QUARTZ_PAUSE)) {
pauseJob(scheduler, scheduleJob.getJobId());
}
} catch (SchedulerException e) {
log.error(“创建定时任务失败”, e);
}
}
public static void updateScheduleJob(Scheduler scheduler, QrtzJobVO scheduleJob) {
try {
TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId());
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
.withMisfireHandlingInstructionDoNothing();
CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId());
if (trigger == null) {
throw new SchedulerException(“获取Cron表达式失败”);
}
trigger =
(CronTrigger)trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
trigger.getJobDataMap().put(“JOB_PARAM_KEY”, scheduleJob);
scheduler.rescheduleJob(triggerKey, trigger);
if (scheduleJob.getStatus().equals(CommonConstant.QUARTZ_PAUSE)) {
pauseJob(scheduler, scheduleJob.getJobId());
}
} catch (SchedulerException e) {
log.error(“更新定时任务失败”, e);
}
}
public static void run(Scheduler scheduler, QrtzJobVO scheduleJob) {
try {
JobDataMap dataMap = new JobDataMap();
dataMap.put(“JOB_PARAM_KEY”, scheduleJob);
scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap);
} catch (SchedulerException e) {
log.error(“执行定时任务失败”, e);
}
}
public static void pauseJob(Scheduler scheduler, Long jobId) {
try {
scheduler.pauseJob(getJobKey(jobId));
} catch (SchedulerException e) {
log.error(“暂停定时任务失败”, e);
}
}
public static void resumeJob(Scheduler scheduler, Long jobId) {
try {
scheduler.resumeJob(getJobKey(jobId));
} catch (SchedulerException e) {
log.error(“恢复定时任务失败”, e);
}
}
public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
try {
scheduler.deleteJob(getJobKey(jobId));
} catch (SchedulerException e) {
log.error(“删除定时任务失败”, e);
}
}
}
5.ScheduleJob
用于执行定时任务。
public class ScheduleJob extends QuartzJobBean {
private static final Logger log = LoggerFactory.getLogger(ScheduleJob.class);
private ExecutorService service = Executors.newSingleThreadExecutor();
@Override
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/a91006bc3f594771dae5a9b644fd3e36.jpeg)
最后
小编精心为大家准备了一手资料
以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术
【附】架构书籍
- BAT面试的20道高频数据库问题解析
- Java面试宝典
- Netty实战
- 算法
BATJ面试要点及Java架构师进阶资料
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ttps://img-community.csdnimg.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />
最后
小编精心为大家准备了一手资料
[外链图片转存中…(img-IybFumoS-1713581250542)]
[外链图片转存中…(img-RvkIYlCM-1713581250542)]
以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术
【附】架构书籍
- BAT面试的20道高频数据库问题解析
- Java面试宝典
- Netty实战
- 算法
[外链图片转存中…(img-RsNZFqGu-1713581250542)]
BATJ面试要点及Java架构师进阶资料
[外链图片转存中…(img-Zux7fe9Q-1713581250543)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!