自定义注解+反射+AOP+异步多线程统一日志管理

本文介绍了如何利用Java的自定义注解、反射、AOP和线程池技术实现异步多线程的日志管理。讨论了线程池的配置和使用,包括定时任务的调度方法、线程工厂的创建以及拒绝策略。还涉及了在高并发场景下优化日志性能的方法,如使用Log4j的AsyncAppender和SizeAndTimeBasedRollingPolicy策略。
摘要由CSDN通过智能技术生成

多线程原因:

导致高并发情况下接口性能下降。

难点:

高并发下的异步线程记录

SpringUtils 研究下

线程池:主业务记个日志,异步需要给系统有个间隔切换,一般10ms。

线程池全局只能有1个,类似一个大别墅,只有一个池

线程池参数如何设置?不能写死!!!

高大上:分布式配置中心+动态线程池

标准:yml文件读取线程池配置【写个类封装 专门读取配置】 跟主业务无关的 按面向对象思想封装OOP

不要用超过5个@Value来获取值 应该单独读到配置类里使用更合适

yaml配置

thread:
  pool:
    core-pool-size: 5
    # 默认是5个人记录 如果是高并发的话直接把下面两个放大到1000和5000 如果1秒来了1w个
    # 我有1000个人来记录 性能就上来了
    max-pool-size: 10
    queue-capacity: 50
    keep-alive-seconds: 60
@Confighration
@ConfigurationProperties(prefix = "thread.pool")【yaml配置里的前缀】
public class ThreadPoolProperties{
    // 核心线程池大小
    private int corePoolSize;
    // 最大可创建线程数
    private int maxPoolSize;
    // 队列最大长度
    private int queueCapacity;
    // 线程池维护线程所允许的空闲时间
    private int keepAliveSeconds;
}

前置知识

Timer定时器

当new一个Timer()的时候定时任务就启动了

这两个底层其实都是调用的new ScheduledThreadPoolExecutor();

里面要传Runnable或者Callable实例

这里Schedule方法只执行一次任务

scheduleAtFixedRate

scheduleAtFixedRate(RUnnable或Callable对象,添加定时任务多久后开始执行, 定时任务执行时间间隔,时间单位)周期执行定时任务

创建个3秒后执行的定时任务,执行间隔2秒

scheduleWithFixedDelay()

方法执行完以后,再隔多长时间执行下一次任务,和scheduleAtFixedRate()不同的是这个方法要执行完才会执行下一次,受方法执行时长影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值