代码改变世界

定时任务的基本功能

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;
    }
}