程序设计
任务异步执行
// 定时任务设计思路:
// 1、先把任务修改为执行中即可结束此方法,同时异步调用任务执行方法
// 2、定时任务扫描执行中的任务,遍历任务执行
private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new LinkedBlockingQueue(1), new ThreadPoolExecutor.DiscardOldestPolicy());
// 定时任务每隔30秒调用一次
@Scheduled(cron="0/30 * * * * ?")
public void taskHandle() {
// 由于定时调度默认是单线程的,这里可以快速执行完成本方法
threadPoolExecutor.submit(() -> {
try {
// 需要根据状态查询数据,这里给之前的方法预留事务事务的时间
Thread.sleep(1000);
List list = new ArrayList();
// 可以根据需要并发处理任务
list.parallelStream().forEach(a -> prepareHandle());
} catch (Throwable e) {
log.error("", e);
}
});
}
// 预调用方法处理
private void prepareHandle() {
// 获取锁
RLock rLock = new RedissonLock();
if (rLock.tryLock()) {
try {
// 执行过程会再次验证任务状态,这里给之前的方法预留事务提交
Thread.sleep(1000);
concreteMethod();
} catch (Throwable e) {
log.error("", e);
} finally {
rLock.unlock();
}
}
}
// 本方法设置为事务方法,以便于本方法的内容同时成功、失败
@Transactional(rollbackFor = Throwable.class)
public void concreteMethod() {
// 再次获取可重入锁
RLock lock = new RedissonLock();
if (lock.tryLock()) {
try {
// 1、判断是否在执行中,否则在这里直接结束执行
// 2、执行处理逻辑
// 3、无报错的情况下即为处理成功,执行成功流程
} catch (Throwable e) {
log.error("", e);
// 4、有异常的情况下,执行异常处理流程
} finally {
lock.unlock();
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)