springboot利用线程池异步记录日志(一)

本文介绍了如何在Spring Boot应用中通过线程池实现日志记录的异步处理,以避免影响主线程执行。内容包括配置线程池、创建任务管理器、定义任务以及在合适位置调用任务执行,以提高应用程序性能。
摘要由CSDN通过智能技术生成
缘由

记录日志录入数据库时,脱离主线程,实现异步插入,这样不会拖延主线程的执行时间
ps:记录日志,可以写在业务逻辑中,也可以利用aop自动记录。

	... service{
		public void login(){
			// 登录逻辑
			......
			// 记录日志插入数据库
			// 这个记录过程是要占用当前线程时间的
			// 通过异步线程执行,可以摆脱这种时间的消耗
			logService.loginInfo(userInfo);
		}
	}
步骤

1.配置线程池
2.自定义一个异步任务管理器
3.自定义任务
4.指定地点处,调用执行任务管理器,传入指定的任务

/**
* 配置线程池
* /
@Configuration
public class ThreadPoolConfig
{
	// 核心线程池大小
    private int corePoolSize = 50;
    
    /**
     * 创建线程池
     * 它继承了ThreadPoolExecutor,也就是说它也是个线程池
     * 调用它,他会去线程池中拿取一个线程来执行你装入的自定义任务
     * schedule使它能够提供一些周期任务和延迟任务相关的操作     * 
     * 相关文档
     * https://blog.csdn.net/nuannuanwfm/article/details/90573943
     */
    @Bean(name = "scheduledExecutorService")
    protected ScheduledExecutorService scheduledExecutorService()
    {
       
Spring Boot中的线程池异步处理通常涉及到使用`ThreadPoolTaskExecutor`或者`AsyncConfigurer`来配置一个后台任务执行器。如果你想要在异步任务执行过程中自定义异常处理,你可以这样做: 1. 配置一个自定义的`ThreadPoolTaskExecutor`: ```java @Configuration public class ThreadPoolConfig { @Bean public ThreadPoolTaskExecutor executor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(256); // 缓存队列大小 executor.setThreadNamePrefix("my-task-"); executor.initialize(); // 初始化设置 executor.afterPropertiesSet(); // 设置后立即启动 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 自定义拒绝策略 return executor; } } ``` 在这个例子中,我们设置了自定义的`RejectedExecutionHandler`,当线程池饱和无法接受新的任务时,会运行提交任务的代码。 2. 自定义异常处理器: 创建一个实现了`RejectedExecutionHandler`接口的类,并重写`rejectedExecution`方法来捕获并处理异常。 ```java @Component public class CustomRejectedExecutionHandler implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { try { throw new MyCustomException("Cannot execute task: " + r.toString()); } catch (MyCustomException e) { // 这里可以记录日志、发送通知或做其他异常处理操作 log.error(e.getMessage(), e); } } } ``` 然后,在需要异步执行的任务中,你可以在try-catch块中抛出`MyCustomException`,这个异常会被`CustomRejectedExecutionHandler`捕获并按照你的意愿处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缔曦_deacy

码字不易,请多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值