springboot 定时任务问题
标签:启动 _id shm 定时 方法 new t 如何 remove star
1.springboot 定时执行某个方法
2.springboot 通过接口生成 某个调度时间 定时执行
方法1: 网上好多案例 不做详细阐述
方法2:业务场景:用户配置一个活动,然后根据配置活动的时间定时推送消息。
1.配置一个每天凌晨的定时任务,去数据库查询数据,将符合条件的 cron表达式放入定时任务中,依次执行,同时将结束时间是昨天的定时任务删除。
2.如果新添加定时任务,需要在当天执行定时任务,需要手动调用定时任务启动方法,添加定时任务。
直接上代码:
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
@Autowired
RoomMembersService roomMembersService;
@Autowired
MongoTemplate mongoTemplate;
private Map> taskMap = new HashMap();
private ScheduledFuture> future;
@Scheduled(cron = "0 0 0 * * ?")
public void syncWxOnlineUsersAndGroupsMsg() {
log.info("-------------> 凌晨调度开始");
//获取所有符合条件的cron表达式,添加调度
List signInCronList = roomMembersService.getSignInCronList();
log.info("-------------> "+signInCronList.size());
for (GroupSignIn groupSignIn : signInCronList){
String cron = groupSignIn.getReminder_cron();
String sign_id = groupSignIn.get_id().toString();
String material_content = groupSignIn.getMaterial_content();
startCron(cron,sign_id,material_content);
}
//获取所有昨天结束的调度,删除任务
List executeOverList = roomMembersService.executeOver();
if (null != executeOverList && executeOverList.size() >0){
for (GroupSignIn groupSignIn : executeOverList){
String sign_id = groupSignIn.get_id().toString();
log.info("删除调度任务",sign_id);
stop(sign_id);
}
}
log.info("-------------> 凌晨调度结束");
}
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
public void startCron(String cron,String sign_id,String material_content) {
log.info("-------------> 开始添加定时任务");
String createTime = TimeUtils.getCurrentTimeInString(TimeUtils.DATETIME_FORMAT_DATE);
ScheduledFuture> future = threadPoolTaskScheduler.schedule(new MyRunnable(cron,sign_id,material_content), new CronTrigger(cron));
// stop(sign_id);
taskMap.put(sign_id,future);
SignInTask signInTask = new SignInTask();
signInTask.setMaterial_content(material_content);
signInTask.setSign_id(sign_id);
signInTask.setReminder_cron(cron);
signInTask.setCreated_date(createTime);
mongoTemplate.insert(signInTask);
}
private class MyRunnable implements Runnable {
private String cron ;
private String sign_id ;
private String material_content ;
public MyRunnable(String cron,String sign_id,String material_content){
this.cron = cron;
this.sign_id = sign_id;
this.material_content = material_content;
}
@Override
public void run() {
roomMembersService.sendSignMsg(sign_id,material_content);
}
}
public boolean stop(String name) {
log.info("-------------> 删除调度开始"+name);
if(null == taskMap.get(name)) {
return false;
}
ScheduledFuture> scheduledFuture = taskMap.get(name);
scheduledFuture.cancel(true);
taskMap.remove(name);
return true;
}
因为本人对 多线程 了解的少,所以还需要优化 如何异步跑调度。
对自己---》需要看定时任务源码,详细理解为什么 这样做,如何优化
springboot 定时任务问题
标签:启动 _id shm 定时 方法 new t 如何 remove star
原文地址:https://www.cnblogs.com/mfser/p/13255892.html
评论