定时任务的基本功能
2023-10-13 16:37 阿方技术圈 阅读(26) 评论(0) 收藏 举报一、首先引入quartz的依赖包
<!-- quartz定时任务 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
添加quartz.properties配置文件
#使用自己的配置文件 org.quartz.jobStore.useProperties:true #默认或是自己改名字都行 org.quartz.scheduler.instanceName: DefaultQuartzScheduler #如果使用集群,instanceId必须唯一,设置成AUTO org.quartz.scheduler.instanceId = AUTO org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount: 10 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 = quartzTest
在applicationContext.xml文件中添加配置
<!--配置dbcp数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/lhf?autoReconnect=true& useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC&allowMultiQueries=true&
nullCatalogMeansCurrent=true" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="maxActive" value="3" />
<property name="maxIdle" value="1" />
</bean>
<!--事务管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置scheduler调度-->
<bean id="schedulerManager" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="quartzproperties" value="classpath:quartz.properties"></property>
<property name="dataSource" ref="dataSource"></property>
</bean>
二、定义定时任务的实体类
package com.heima.schedualTask;
public class JobAndTriggerDomain {
private String id;
private String jobName;
private String jobGroupName;
private String jobClassName;
private String jobStatus;
private String triggerName;
private String triggerGroupName;
private String cronExpression;
private String param;
private String des;
private String effFlag;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
public String getJobGroupName() {
return jobGroupName;
}
public void setJobGroupName(String jobGroupName) {
this.jobGroupName = jobGroupName;
}
public String getJobClassName() {
return jobClassName;
}
public void setJobClassName(String jobClassName) {
this.jobClassName = jobClassName;
}
public String getJobStatus() {
return jobStatus;
}
public void setJobStatus(String jobStatus) {
this.jobStatus = jobStatus;
}
public String getTriggerName() {
return triggerName;
}
public void setTriggerName(String triggerName) {
this.triggerName = triggerName;
}
public String getTriggerGroupName() {
return triggerGroupName;
}
public void setTriggerGroupName(String triggerGroupName) {
this.triggerGroupName = triggerGroupName;
}
public String getCronExpression() {
return cronExpression;
}
public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}
public String getParam() {
return param;
}
public void setParam(String param) {
this.param = param;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public String getEffFlag() {
return effFlag;
}
public void setEffFlag(String effFlag) {
this.effFlag = effFlag;
}
}
三、编写定时任务的服务类
package com.heima.schedualTask;
import org.quartz.*;
import org.springframework.context.ApplicationContext;
public class QuartzService {
private ApplicationContext applicationContext;
//新增定时任务
public void addJobAndTrigger(JobAndTriggerDomain jobAndTriggerDomain){
if(!checkCLass(jobAndTriggerDomain.getJobClassName())){
try {
throw new Exception("class"+jobAndTriggerDomain.getJobClassName()+"不存在");
} catch (Exception e) {
e.printStackTrace();
}
}
if(!checkCron(jobAndTriggerDomain.getCronExpression())){
try {
throw new Exception("cron表达式"+jobAndTriggerDomain.getCronExpression()+"不可用");
} catch (Exception e) {
e.printStackTrace();
}
}
JobDetail jobDetail = null;
Trigger trigger = null;
try {
jobDetail= JobBuilder.newJob((Class<? extends Job>)Class.forName(jobAndTriggerDomain.getJobClassName()))
.withIdentity(jobAndTriggerDomain.getJobName(),jobAndTriggerDomain.getJobGroupName())
.usingJobData("STRING",jobAndTriggerDomain.getParam())
.storeDurably(true).build();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
trigger = TriggerBuilder.newTrigger().withIdentity(jobAndTriggerDomain.getTriggerName(),jobAndTriggerDomain.getTriggerGroupName())
.withSchedule(CronScheduleBuilder.cronSchedule(jobAndTriggerDomain.getCronExpression()).withMisfireHandlingInstructionDoNothing())
.build();
Scheduler scheduler = (Scheduler)applicationContext.getBean("schedulerManager");
try {
scheduler.scheduleJob(jobDetail,trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//删除定时任务
public void deleteJobAndTrigger(JobAndTriggerDomain jobAndTriggerDomain){
Scheduler scheduler = (Scheduler)applicationContext.getBean("schedulerManager");
try {
JobKey jobKey = JobKey.jobKey(jobAndTriggerDomain.getJobName(),jobAndTriggerDomain.getJobGroupName());
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//修改定时任务
public void updateJobAndTrigger(JobAndTriggerDomain jobAndTriggerDomain){
Scheduler scheduler = (Scheduler)applicationContext.getBean("schedulerManager");
TriggerKey triggerKey = TriggerKey.triggerKey(jobAndTriggerDomain.getTriggerName(),jobAndTriggerDomain.getTriggerGroupName());
try {
CronTrigger cronTrigger = (CronTrigger)scheduler.getTrigger(triggerKey);
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobAndTriggerDomain.getCronExpression()).withMisfireHandlingInstructionDoNothing();
cronTrigger = cronTrigger.getTriggerBuilder()
.withIdentity(triggerKey)
.withSchedule(cronScheduleBuilder)
.build();
JobKey jobKey = JobKey.jobKey(jobAndTriggerDomain.getJobName(),jobAndTriggerDomain.getJobGroupName());
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
jobDetail.getJobDataMap().put("STRING",jobAndTriggerDomain.getParam());
scheduler.addJob(jobDetail,true);
scheduler.rescheduleJob(triggerKey,cronTrigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//停用定时任务
public void disabledJob(JobAndTriggerDomain jobAndTriggerDomain){
Scheduler scheduler = (Scheduler)applicationContext.getBean("schedulerManager");
JobKey jobKey = JobKey.jobKey(jobAndTriggerDomain.getJobName(),jobAndTriggerDomain.getJobGroupName());
try {
scheduler.pauseJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//启用定时任务
public void resumeJob(JobAndTriggerDomain jobAndTriggerDomain){
Scheduler scheduler = (Scheduler)applicationContext.getBean("schedulerManager");
JobKey jobKey = JobKey.jobKey(jobAndTriggerDomain.getJobName(),jobAndTriggerDomain.getJobGroupName());
try {
scheduler.resumeJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//立即执行一次定时任务
public void oneExecuteJob(JobAndTriggerDomain jobAndTriggerDomain){
Scheduler scheduler = (Scheduler)applicationContext.getBean("schedulerManager");
JobKey jobKey = JobKey.jobKey(jobAndTriggerDomain.getJobName(),jobAndTriggerDomain.getJobGroupName());
try {
scheduler.triggerJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
private boolean checkCron(String cronExpression) {
try {
CronScheduleBuilder.cronSchedule(cronExpression);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
private boolean checkCLass(String jobClassName) {
try {
Class.forName(jobClassName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false;
}
return true;
}
}
浙公网安备 33010602011771号