SpringBoot+Scheduling实现定时任务

近期有个数据报表查看的需求,考虑到数据量太大,决定舍弃实时查看的方案,采用每天更新数据的方案,于是就写了一个定时任务的方法,特此记录

先上代码:
/**
 * @Description 可视化定时任务
 * @Date 2020/7/1
 **/
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {

   @Autowired
    private ScheduleConfigRepo scheduleConfigRepo;

   @Autowired
   private PeriodCostService periodCostService;

   @Autowired
    private FormCountDataService formCountDataService;

    /**
     * 定时任务方法
     * @param taskRegistrar
     */
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(
                //1.添加任务内容(Runnable)
                () -> dealContactOnelife(),
                //2.设置执行周期(Trigger)
                triggerContext -> {
                    //2.1 从数据库获取执行周期
                    String cron = scheduleConfigRepo.findOneInUse().getTaskCron();
                    System.out.println("Cron:"+cron);
                    //2.2 合法性校验.
                    if (StringUtils.isEmpty(cron)) {
                        // Omitted Code ..
                    }
                    //2.3 返回执行周期(Date)
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }

    public boolean dealContactOnelife(){
        System.out.println("数据定时任务开始执行,开始时间:"+ LocalDateTime.now().toLocalTime());
        boolean resultNums = true;
        try {
            resultNums = getContactOnelife();
        } catch(Exception e){
            System.out.println("数据获取失败,请注意检查,失败原因:"+ e);
            dealContactOnelife();//失败了就重新开始跑数
        }
        return resultNums;
    }

    private boolean getContactOnelife() throws Exception{

        long starttime = System.currentTimeMillis();
        formCountDataService.getCountData();
        long endtime = System.currentTimeMillis();
        System.out.println("整体方法耗时:"+(endtime-starttime)/1000 +"s");

        return true;
    }

}

这个方法可以在程序启动的时候,就自动运行,到达设定时间,执行配置好的方法。

上面方法的cron表达式是在库里取值,如果满足需求,也可直接写死,我这里是为了方便配置定时任务的执行时间,可以直接在页面配置定时任务的执行时间
下面是获取cron表达式的相关代码:
Bean:
@Entity
@Table(name = "schedule_Config")
@Proxy(lazy = false)
@Data
public class ScheduleConfigBean extends BaseIDWorkEntity<ScheduleConfigBean> {

    @Column(name = "task_name")
    private String taskName;//定时任务名称

    @Column(name = "task_cron")
    private String taskCron;//定时任务表达式

    @Column(name = "status")
    private String status;//状态 0:正常使用 1:暂停使用

    @Column(name = "remark")
    private String remark;//备注

}
Dao:
@Repository
public interface ScheduleConfigRepo extends BaseRepo<ScheduleConfigBean,Long> {

    @Query(value = "select * from cm_schedule_Config where status = '0'", nativeQuery = true)
    ScheduleConfigBean findOneInUse();

}
数据库表结构:
CREATE TABLE `cm_schedule_Config` (
  `id` bigint(20) NOT NULL,
  `task_name` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '定时任务名称',
  `task_cron` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '定时任务执行时间-周期表达式',
  `status` enum('1','0') COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-正常可使用,1-已弃用',
  `update_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '上一次更新时间',
  `create_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '数据创建时间',
  `remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注信息',
  `create_by` bigint(20) DEFAULT NULL,
  `update_by` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='定时任务配置表';

效果图如下:

SpringBoot+Scheduling实现定时任务_第1张图片
SpringBoot+Scheduling实现定时任务_第2张图片

你可能感兴趣的:(java)