SpringBoot 封装异步、延迟执行任务简单demo
ThreadPoolConfig.java
import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.*; /** * 线程池配置类 **/ @Configuration @Slf4j public class ThreadPoolConfig { /** * 核心线程池大小 */ private int corePoolSize = 50; /** * 执行定时任务 */ @Bean(name = "scheduledExecutorService") protected ScheduledExecutorService scheduledExecutorService() { return new ScheduledThreadPoolExecutor(corePoolSize, new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) { @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); printException(r, t); } }; } /** * 打印线程异常信息 */ public static void printException(Runnable r, Throwable t) { if (t == null && r instanceof Future<?>) { try { Future<?> future = (Future<?>) r; if (future.isDone()) { future.get(); } } catch (CancellationException ce) { t = ce; } catch (ExecutionException ee) { t = ee.getCause(); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); } } if (t != null) { log.error(t.getMessage(), t); } } }
AsyncManager.java (SpringUtils.java 参考:https://www.cnblogs.com/pxblog/p/15065785.html)
import lombok.extern.slf4j.Slf4j; import java.util.TimerTask; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * 异步任务管理器 */ @Slf4j public class AsyncManager { /** * 操作延迟10毫秒执行 */ private final int OPERATE_DELAY_TIME = 10; /** * 异步操作任务调度线程池 */ private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); /** * 单例模式 */ private AsyncManager() { } private static AsyncManager me = new AsyncManager(); public static AsyncManager me() { return me; } /** * 执行任务 * * @param task 任务 */ public void execute(TimerTask task) { executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); } /** * 停止线程池 */ public void shutdown() { if (executor != null && !executor.isShutdown()) { executor.shutdown(); try { if (!executor.awaitTermination(120, TimeUnit.SECONDS)) { executor.shutdownNow(); if (!executor.awaitTermination(120, TimeUnit.SECONDS)) { log.info("Pool did not terminate"); } } } catch (InterruptedException ie) { executor.shutdownNow(); Thread.currentThread().interrupt(); } } } }
使用 demo
@GetMapping(value = "/indexttest") public String index(){ /** * 异步任务处理 */ AsyncManager.me().execute(new TimerTask() { @Override public void run() { System.out.println("我执行了异步任务"); } }); return "success"; }
也可以单独任务罗出来
AsyncFactory.java
import java.util.TimerTask;
public class AsyncFactory {
/**
* 同步任务
*/
public static TimerTask syncJob() {
return new TimerTask() {
@Override
public void run() {
System.out.println("我在调用同步");
}
};
}
}
要加个处理 退出销毁
@PreDestroy public void destroy() { try { log.info("====关闭后台任务任务线程池===="); AsyncManager.me().shutdown(); } catch (Exception e) { log.error(e.getMessage(), e); } }
-----------------------有任何问题可以在评论区评论,也可以私信我,我看到的话会进行回复,欢迎大家指教------------------------
(蓝奏云官网有些地址失效了,需要把请求地址lanzous改成lanzoux才可以)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2020-11-21 JAVA字符串繁体简体相互转换