近期有个数据报表查看的需求,考虑到数据量太大,决定舍弃实时查看的方案,采用每天更新数据的方案,于是就写了一个定时任务的方法,特此记录
先上代码:
/**
* @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='定时任务配置表';
效果图如下: