您的位置:首页 > 教育 > 培训 > 设计说明怎么写_免费漫画软件 全免费_任何东西都能搜出来的软件_百度指数官方版

设计说明怎么写_免费漫画软件 全免费_任何东西都能搜出来的软件_百度指数官方版

2024/10/5 21:23:49 来源:https://blog.csdn.net/jspyth/article/details/142638649  浏览:    关键词:设计说明怎么写_免费漫画软件 全免费_任何东西都能搜出来的软件_百度指数官方版
设计说明怎么写_免费漫画软件 全免费_任何东西都能搜出来的软件_百度指数官方版

前言

  这篇文章教大家在springboot项目中实现一个定时任务执行的功能,并且该定时任务要具备服务重启后也能执行的能力,本文会详细分析思路,并提供完整实现代码。

思路

  定时任务线程我们使用TimerTask实现。实现思路是写一个接口接收客户端传过来的任务执行时间等参数,然后接口使用TimerTask根据接收到的执行时间参数创建定时任务,并持久化该次任务的任务ID以及执行时间,然后用CommandLineRunner写一个服务启动时执行的任务线程去查询还未执行的定时任务,并使用TimerTask将任务线程重新生成,这样就可以实现服务重启后原定的定时任务也能到点执行。

代码实现

待执行定时任务实体类

import lombok.Data;@Data
public class CampaignRecordEntity {private Long id;private String pushTime;private Long campaignId;private String type;private String proxy;
}

接收执行时间参数并持久化待执行任务

// todo 下面这里要记录本次任务的参数内容,并为本次任务请求生成一个任务ID 这里假设任务ID 001
String pushTime = "2024-09-29 18:00:00";// 参数传入的任务执行时刻
String taskId = "001";
Timer timer = new Timer(uuid);
TimerTask task = new TimerTask() {@Overridepublic void run() {try {// todo 下面可以写你待执行任务需要执行的具体内容// 执行完要删除掉任务记录,以免每次重启都查询到任务记录并生成不必要的任务线程int deleteRecordNum = browserPushMsgMapper.deleteCampaignRecordByCampaignId(taskId );if (deleteRecordNum > 0) {log.info("delete campaign record success.");}} catch (Exception ex) {ex.printStackTrace();}}
};
timer.schedule(task, DateUtils.StringToDate(pushTime, "yyyy-MM-dd HH:mm:ss"));
uuidTimerTaskContainer.put(uuid, task);
CampaignRecordEntity entity = new CampaignRecordEntity();
entity.setCampaignId(e.getId());
entity.setPushTime(pushTime);
int num = mapper.insertCampaignRecord(entity, "Remo");
if (num > 0) {log.info("insert campaign record success.");
}

服务启动时待执行任务查询生成

  由于服务重启会导致重启前生成的任务线程被杀死,因此重启后需要重新生成任务线程:

@Slf4j
@Component
@Order(100)
public class SendMsgStartTask implements CommandLineRunner {@Resourceprivate Mapper mapper;@Overridepublic void run(String... args) throws Exception {List<CampaignRecordEntity> records = browserPushMsgMapper.queryCampaignRecords();if (records != null && records.size() > 0) {for (CampaignRecordEntity entity : records) {try {Timer timer = new Timer(UuidUtils.getUuidString(20));String taskId = entity.getId();TimerTask task = new TimerTask() {@Overridepublic void run() {// todo 执行到执行时刻需要执行的内容// 执行完后要清楚待执行任务int deleteRecordNum = mapper.deleteCampaignRecordByCampaignId(taskId);if (deleteRecordNum > 0) {log.info("delete campaign record success.");}}};timer.schedule(task, DateUtils.StringToDate(DateUtils.millisecondToDate(recordVo.getTime(), "yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss"));} catch (Exception ex) {ex.printStackTrace();}}}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com