Spring series-springboot integra tareas de sincronización de cuartos

Introducción

Este artículo presenta principalmente las tareas de sincronización del trimestre de integración Springboot de la serie Spring, que se dividen aproximadamente en tres partes: agregar paquetes jar, crear una clase de configuración para tareas de sincronización y crear tareas específicas para ejecutar. Espero que sea útil para todos después de leer este artículo.

Uno, agregue el paquete del frasco

 <!--quartz定时任务-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

Dos, cree una clase de configuración para tareas de tiempo

Puede entenderse como qué tareas va a realizar esta clase y cuándo realizarlas.

package com.vale.info.server.quartz;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.vale.info.server.dao.CronDao;
import com.vale.info.server.entity.Cron;
import com.vale.info.server.global.RedisConstants;
import com.vale.info.server.util.InfoException;
import com.vale.info.server.util.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * TODO
 *
 * @author wasin
 * @version 1.0
 * @date 2020/9/7 19:33
 */
@Component
@Slf4j
public class TaskFileScheduler {

    @Resource
    private SchedulerFactoryBean schedulerFactoryBean;

    private Integer taskId;

    public void setTaskId(Integer taskId){
        this.taskId=taskId;
    }

    @Resource
    private Scheduler scheduler;

    /**
     * 设置任务的执行时间
     * @param scheduler
     * RedisConstants. 相关的是我自己定义的静态变量 为这个定时任务添加任务的名称 和分组
     * 后期如果需要删除时则找到相关的名称去删除即可
     * @throws SchedulerException
     */
    private void setTaskExecuteDate(Scheduler scheduler) throws SchedulerException {
        log.info("设置任务的执行时间 taskId={},任务名称={},分组名称={}",taskId,String.format(RedisConstants.QUARTER_JOB_NAME,taskId),String.format(RedisConstants.QUARTER_JOB_GROUP,taskId));
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class).withIdentity(String.format(RedisConstants.QUARTER_JOB_NAME,taskId), String.format(RedisConstants.QUARTER_JOB_GROUP,taskId)).build();
         //2020-9-18 18:18:18秒执行这个任务
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("18 18 18 18 9 ? 2020");
        JobDataMap jobDataMap=new JobDataMap();

        jobDataMap.put("taskId",this.taskId);
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(String.format(RedisConstants.QUARTER_TRIGGER_NAME,taskId), String.format(RedisConstants.QUARTER_TRIGGER_GROUP,taskId))
                .usingJobData(jobDataMap).withSchedule(scheduleBuilder).build();
        scheduler.scheduleJob(jobDetail,cronTrigger);
    }

    //业务代码中掉用这个方法就可以添加这个定时任务
    public void scheduleJobs(Integer taskId) throws SchedulerException {
        if(taskId==null){
            throw new InfoException("定时任务id不可为空");
        }
        this.taskId=taskId;
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        setTaskExecuteDate(scheduler);
    }

    /**
     * 删除定时任务
     * @param croId  定时任务id
     * @param jobName 任务名称  就是任务id
     * @param jobGroup 任务分组 就是任务id
     */
    public void delJob(Integer croId,String jobName, String jobGroup) {
        try {
          log.info("删除定时任务 jobName={},jobGroup={}",jobName,jobGroup);
            this.taskId=Integer.valueOf(jobName);
            jobName=String.format(RedisConstants.QUARTER_TRIGGER_NAME,jobName);
            jobGroup=String.format(RedisConstants.QUARTER_TRIGGER_GROUP,jobGroup);
            // TriggerKey 定义了trigger的名称和组别 ,通过任务名和任务组名获取TriggerKey
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName,jobGroup);
            if(triggerKey!=null){
                // 停止触发器
                scheduler.resumeTrigger(triggerKey);
                // 移除触发器
                scheduler.unscheduleJob(triggerKey);
                // 移除任务
                scheduler.deleteJob(JobKey.jobKey(jobName,jobGroup));
                log.info("定时任务删除成功");
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

    }

}

Tres, crea tareas específicas

Se puede entender como qué hacer en esta tarea. Lo que se define arriba es cuándo hacerlo y quién lo hará.

package com.vale.info.server.quartz;

import com.vale.info.server.dao.CronDao;
import com.vale.info.server.entity.Cron;
import com.vale.info.server.entity.Task;
import com.vale.info.server.global.UdpConstans;
import com.vale.info.server.util.ReadFile;
import com.vale.info.server.util.RedisUtils;
import com.vale.info.server.util.UdpFileClient;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.IOException;

/**
 * TODO
 * 定义一个需要去执行的任务
 * @author wasin
 * @version 1.0
 * @date 2020/9/7 19:25
 */
@Component
@Slf4j
public class TaskJob implements Job {

    //这些参数都可以在上面定义的类中传过来

    private Integer taskId;

    public void setTaskId(Integer taskId) {
        this.taskId = taskId;
    }
    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        log.info("定时任务执行 taskId={}",taskId);
        //执行具体的业务逻辑 

    }
}

fin

Gracias a todos por ver el final. Es el final. Solo dale "Me gusta" y vete. Por favor, corrígeme si hay algo mal.

Supongo que te gusta

Origin blog.51cto.com/14969174/2542936
Recomendado
Clasificación