SpringBoot怎么实现模块日志入库


这篇文章主要介绍“SpringBoot怎么实现模块日志入库”,在日常操作中,相信很多人在SpringBoot怎么实现模块日志入库问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot怎么实现模块日志入库”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!模块日志的实现方式大致有三种:AOP + 自定义注解实现输出指定格式日志 + 日志扫描实现在接口中通过代码侵入的方式,在业务逻辑处理之后,调用方法记录日志。这里我们主要讨论下第3种实现方式。假设我们需要实现一个用户登录之后记录登录日志的操作。调用关系如下:这里的核心代码是在 LoginService.login() 方法中设置了在事务结束后执行:在这里,我们把这段代码封装成了工具类,参考:4.TransactionUtils。如果在 LoginService.login() 方法中开启了事务,不指定事务提交后指定的话,日志处理的方法做异步和做新事务都会有问题:做异步:由于主事务可能没有执行完毕,导致可能读取不到主事务中新增或修改的数据信息;做新事物:可以通过 Propagation.REQUIRES_NEW 事务传播行为来创建新事务,在新事务中执行记录日志的操作,可能会导致如下问题:由于数据库默认事务隔离级别是可重复读,意味着事物之间读取不到未提交的内容,所以也会导致读取不到主事务中新增或修改的数据信息;如果开启的新事务和之前的事务操作了同一个表,就会导致锁表。什么都不做,直接同步调用:问题最多,可能导致如下几个问题:不捕获异常,直接导致接口所有操作回滚;捕获异常,部分数据库,如:PostgreSQL,同一事务中,只要有一次执行失败,就算捕获异常,剩余的数据库操作也会全部失败,抛出异常;日志记录耗时增加接口响应时间,影响用户体验。@TitleAction
*@Description自定义动作函数式接口
*
*@authorACGkaka
*@date2023/4/2613:55
*/
publicinterfaceAction{
/**
*执行动作
*/
voiddoSomething();
}@TitleTransactionUtils
*@Description事务同步工具
*
*@authorACGkaka
*@date2023/4/2613:45
*/
publicclassTransactionUtils{
/**
*提交事务前执行
*/
publicstaticvoidbeforeTransactionCommit(Actionaction){
TransactionSynchronizationManager.registerSynchronization(newTransactionSynchronization(){
@Override
publicvoidbeforeCommit(booleanreadOnly){
//异步执行
action.doSomething();
}
});
}
/**
*提交事务后异步执行
*/
publicstaticvoidafterTransactionCommit(Actionaction){
TransactionSynchronizationManager.registerSynchronization(newTransactionSynchronization(){
@Override
publicvoidafterCommit(){
//异步执行
action.doSomething();
}
});
}
}注意:@Async 需要配合 @EnableAsync 使用,@EnableAsync 添加到启动类、配置类、自定义线程池类上均可。补充:由于 @Async 注解会动态创建一个继承类来扩展方法的实现,所以可能会导致当前类注入Bean容器失败 BeanCurrentlyInCreationException,可以使用如下方式:自定义线程池 + @Autowired1)自定义线程池AsyncTaskExecutorConfig.java@TitleAsyncTaskExecutorConfig
*@Description异步线程池配置
*
*@authorACGkaka
*@date2023/4/2419:48
*/
@EnableAsync
@Configuration
publicclassAsyncTaskExecutorConfig{
/**
*核心线程数(线程池维护线程的最小数量)
*/
privateintcorePoolSize=10;
/**
*最大线程数(线程池维护线程的最大数量)
*/
privateintmaxPoolSize=200;
/**
*队列最大长度
*/
privateintqueueCapacity=10;
@Bean
publicTaskExecutortaskExecutor(){
ThreadPoolTaskExecutorexecutor=newThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix(“MyExecutor-“);
//forpassinginrequestscopecontext转换请求范围的上下文
executor.setTask免费云主机域名Decorator(newContextCopyingDecorator());
//rejection-policy:当pool已经达到maxsize的时候,如何处理新任务
//CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(newThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.initialize();
returnexecutor;
}
}2)复制上下文请求ContextCopyingDecorator.java@TitleContextCopyingDecorator
*@Description上下文拷贝装饰者模式
*
*@authorACGkaka
*@date2023/4/2420:20
*/
publicclassContextCopyingDecoratorimplementsTaskDecorator{
@Override
publicRunnabledecorate(Runnablerunnable){
try{
//从父线程中获取上下文,然后应用到子线程中
RequestAttributesrequestAttributes=RequestContextHolder.currentRequestAttributes();
Mapprevious=MDC.getCopyOfContextMap();
SecurityContextsecurityContext=SecurityContextHolder.getContext();
return()->{
try{
if(previous==null){
MDC.clear();
}else{
MDC.setContextMap(previous);
}
RequestContextHolder.setRequestAttributes(requestAttributes);
SecurityContextHolder.setContext(securityContext);
runnable.run();
}finally{
//清除请求数据
MDC.clear();
RequestContextHolder.resetRequestAttributes();
SecurityContextHolder.clearContext();
}
};
}catch(IllegalStateExceptione){
returnrunnable;
}
}
}
3)自定义线程池实现异步 LoginService我们还可以使用TransactionTemplate来代替 @Transactional 注解:经测试:这种实现方式抛出异常后,事务也可以正常回滚正常执行之后也可以读取到事务执行后的内容,可行。别看日志记录好实现,坑是真的多,这里记录的只是目前遇到的问题。到此,关于“SpringBoot怎么实现模块日志入库”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: thinkphp5查询数据库的方法有哪些

本篇内容介绍了“thinkphp5查询数据库的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 一、使用模型进行查询模型是利用ThinkPHP5的ORM…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/09 12:42
Next 07/09 12:43

相关推荐