精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

高效審計!Spring AOP + 多線程 + 批量處理的智能解決方案

開發 前端
本方案基于 Spring AOP 實現自動攔截日志操作,結合 異步任務執行 提升系統吞吐能力,并采用 批量存儲 降低數據庫壓力,從而構建了一套高效、低耦合的審計日志解決方案。

在現代企業應用中,審計日志(Audit Log)是必不可少的功能。它不僅可以用于安全合規審計,還能幫助開發者進行系統調試與問題排查。然而,傳統的日志記錄方式往往存在性能瓶頸,例如同步記錄日志可能會影響系統響應速度,而單條插入數據庫的方式則容易造成數據庫壓力過大。

為了解決這些問題,我們可以結合 Spring AOP異步處理 和 批量存儲,實現一個高效、可靠的審計日志方案。本篇文章將詳細講解該方案的設計思路,并提供完整的代碼實現。

關鍵需求

  • 記錄核心業務操作的完整軌跡
  • 捕獲操作前后的數據狀態
  • 包含操作者信息、時間戳及變更詳情
  • 采用異步存儲,減少對主業務流程的影響

解決方案

自定義注解

package com.icoderoad.audit.annotation;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interfaceOperationAudit{
    /** 操作類型標識 */
    StringoperationCode();
    /** 操作描述(支持 SpEL 表達式) */
    Stringdescription() default"";
    /** 操作者表達式 */
    Stringoperator() default"@auditOperator.getName";
    /** 操作前狀態 */
    StringpreState() default"";
    /** 操作后狀態 */
    StringpostState() default"";
}

審計實體及存儲

審計記錄實體

package com.icoderoad.audit.entity;


import jakarta.persistence.*;
import java.time.LocalDateTime;


@Entity
@Table(name = "sys_audit_log")
public class AuditRecord {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String operationCode;
    @Column(length = 500)
    private String description;
    private String operator;
    private LocalDateTime operationTime;
    @Lob
    private String preState;
    @Lob
    private String postState;
    private boolean success;
    private String errorMessage;
}

數據訪問層

package com.icoderoad.audit.repository;


import com.icoderoad.audit.entity.AuditRecord;
import org.springframework.data.jpa.repository.JpaRepository;


public interface AuditRepository extends JpaRepository<AuditRecord, Long> {}

異步審計記錄器

package com.icoderoad.audit.service;


import com.icoderoad.audit.entity.AuditRecord;
import com.icoderoad.audit.repository.AuditRepository;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.*;


@Component
public class AuditRecorder {
    private static final long MAX_FLUSH_INTERVAL = 3000;
    private volatile long lastFlushTime = System.currentTimeMillis();
    private final BlockingQueue<AuditRecord> auditQueue = new LinkedBlockingQueue<>(1000);
    private final Executor executor = Executors.newSingleThreadExecutor();
    private final AuditRepository auditRepository;


    public AuditRecorder(AuditRepository auditRepository) {
        this.auditRepository = auditRepository;
        startConsumer();
    }


    public void record(AuditRecord record) {
        if (!auditQueue.offer(record)) {
            System.err.println("審計隊列已滿,記錄被丟棄: " + record);
        }
    }


    private void startConsumer() {
        executor.execute(() -> {
            List<AuditRecord> buffer = new ArrayList<>(100);
            while (!Thread.interrupted()) {
                try {
                    AuditRecord record = auditQueue.poll(MAX_FLUSH_INTERVAL, TimeUnit.MILLISECONDS);
                    if (record != null) {
                        buffer.add(record);
                    }
                    if (buffer.size() >= 100 || System.currentTimeMillis() - lastFlushTime > MAX_FLUSH_INTERVAL) {
                        if (!buffer.isEmpty()) {
                            auditRepository.saveAll(buffer);
                            buffer.clear();
                            lastFlushTime = System.currentTimeMillis();
                        }
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });
    }
}

審計切面

package com.icoderoad.audit.aspect;


import com.icoderoad.audit.annotation.OperationAudit;
import com.icoderoad.audit.entity.AuditRecord;
import com.icoderoad.audit.service.AuditRecorder;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.expression.*;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.time.LocalDateTime;


@Aspect
@Component
public class AuditAspect implements BeanFactoryAware {
    private final AuditRecorder auditRecorder;
    private BeanFactory beanFactory;
    private final ExpressionParser parser = new SpelExpressionParser();
    private final ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();


    public AuditAspect(AuditRecorder auditRecorder) {
        this.auditRecorder = auditRecorder;
    }


    @Around("@annotation(auditAnnotation)")
    public Object auditOperation(ProceedingJoinPoint joinPoint, OperationAudit auditAnnotation) throws Throwable {
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
        Object[] args = joinPoint.getArgs();
        EvaluationContext context = createEvaluationContext(method, args);


        AuditRecord record = prepareAuditRecord(auditAnnotation, context);
        record.setPreState(evaluateExpression(auditAnnotation.preState(), context));


        try {
            Object result = joinPoint.proceed();
            context.setVariable("result", result);
            record.setPostState(evaluateExpression(auditAnnotation.postState(), context));
            record.setSuccess(true);
            return result;
        } catch (Exception ex) {
            record.setSuccess(false);
            record.setErrorMessage(ex.getMessage());
            throw ex;
        } finally {
            auditRecorder.record(record);
        }
    }


    private EvaluationContext createEvaluationContext(Method method, Object[] args) {
        MethodBasedEvaluationContext context = new MethodBasedEvaluationContext(null, method, args, parameterNameDiscoverer);
        context.setBeanResolver(new BeanFactoryResolver(this.beanFactory));
        return context;
    }


    private AuditRecord prepareAuditRecord(OperationAudit annotation, EvaluationContext context) {
        AuditRecord record = new AuditRecord();
        record.setOperationCode(annotation.operationCode());
        record.setDescription(evaluateExpression(annotation.description(), context));
        record.setOperator(evaluateExpression(annotation.operator(), context));
        record.setOperationTime(LocalDateTime.now());
        return record;
    }


    private String evaluateExpression(String expr, EvaluationContext context) {
        try {
            return parser.parseExpression(expr).getValue(context, String.class);
        } catch (Exception e) {
            return "";
        }
    }


    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }
}

測試

package com.icoderoad.audit.service;


import com.icoderoad.audit.annotation.OperationAudit;
import org.springframework.stereotype.Service;


@Service
public class OrderService {
    @OperationAudit(
        operationCode = "ORDER_STATUS_UPDATE",
        description = "'訂單狀態更新: ' + #orderNo",
        preState = "#oldStatus",
        postState = "#newStatus"
    )
    public void updateOrderStatus(String orderNo, Integer oldStatus, Integer newStatus) {
        // 業務邏輯...
    }
}

結論

本方案基于 Spring AOP 實現自動攔截日志操作,結合 異步任務執行 提升系統吞吐能力,并采用 批量存儲 降低數據庫壓力,從而構建了一套高效、低耦合的審計日志解決方案。

在實際應用中,該方案能夠有效提升日志存儲的效率,同時減少對主業務流程的影響。如果你的系統需要高效的日志管理,推薦采用該方案,并可根據業務需求進一步擴展,例如支持多數據源存儲、日志清理策略等。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2009-09-14 19:39:14

批量線程同步

2024-07-12 11:35:20

2010-02-04 11:57:32

ibmdw商務智能

2022-11-08 14:17:39

2023-07-21 09:57:06

2023-10-31 15:04:12

人工智能自然語言處理

2010-02-25 15:19:43

SAPSaaSBI

2023-10-31 16:20:12

2024-01-02 10:46:13

2012-05-18 11:17:58

Java多線程

2010-01-14 14:34:48

千兆智能交換機

2022-05-20 06:14:57

人工智能AI

2021-01-21 15:48:56

物聯網智慧城市5G

2009-07-15 17:09:32

Swing線程

2012-05-15 09:57:39

運維安全\運維審計

2025-01-07 08:20:00

2023-08-02 11:30:13

自動化人工智能

2011-08-02 11:23:34

甲骨文稅收應用商務智能

2023-08-02 15:12:20

人工智能交通運輸
點贊
收藏

51CTO技術棧公眾號

性欧美18一19内谢| 国产精品视频yy9099| 亚洲av无码一区二区三区观看| 国产社区精品视频| 久久久欧美精品sm网站| 国产欧美日韩中文字幕| 国产亚洲色婷婷久久99精品| 日本欧美韩国国产| 欧美疯狂做受xxxx富婆| 丁香六月激情婷婷| 9色在线视频| av高清久久久| 国产日韩欧美综合| 男人日女人网站| 综合久久精品| 亚洲欧美日韩国产中文专区| 在线a免费观看| 久久sese| 亚洲一区中文在线| 亚洲精品一区国产精品| 国精产品乱码一区一区三区四区| 美女日韩在线中文字幕| 欧美精品在线播放| 国产不卡在线观看视频| 人体久久天天| 日韩欧美在线影院| 亚洲视频一二三四| 日韩高清中文字幕一区二区| 亚洲综合色成人| 亚洲精品二区| 成人好色电影| 99国产欧美另类久久久精品| 91亚洲人电影| 一级特黄录像免费看| 日韩精品午夜视频| 欧美一级大片视频| 国产精品18p| 欧美在线首页| 久久久精品久久| 91麻豆制片厂| 精品精品99| 亚洲欧美在线看| 欧美精品黑人猛交高潮| 精品视频高潮| 亚洲国产精品久久久久秋霞蜜臀 | 影音欧美亚洲| 成黄免费在线| 国产亚洲成aⅴ人片在线观看| 精品一区二区日本| 色一情一乱一区二区三区| 国产不卡视频一区| http;//www.99re视频| 国产同性人妖ts口直男| 狠狠色丁香九九婷婷综合五月| 国产精品亚洲美女av网站| 成人h动漫精品一区二区下载| 亚洲欧美日韩国产| 欧美综合在线第二页| 老熟妇仑乱一区二区av| 免费亚洲一区| 国产精品吹潮在线观看| 精品国产青草久久久久96| 日本欧美一区二区| 成人激情视频在线| 国产不卡av在线播放| 国产suv精品一区二区6| 岛国一区二区三区高清视频| 欧美视频一二区| 99久久久精品免费观看国产蜜| 久久偷窥视频| 国产高清一级毛片在线不卡| 国产精品视频在线看| 一区二区成人国产精品| 在线播放蜜桃麻豆| 五月婷婷激情综合| 成人一级片网站| 69堂免费精品视频在线播放| 欧美二区三区的天堂| 精品国产一二区| 青青一区二区| 日韩视频免费在线观看| 欧美日韩综合一区二区| 亚洲三级网站| 国产精品日本精品| 亚洲精品无码专区| 久久影院午夜论| 亚洲一区二区三区乱码| 日本三级在线观看网站| 五月天精品一区二区三区| 色哟哟精品视频| 亚洲精品不卡在线观看| 亚洲日韩第一页| 久久国产波多野结衣| 亚洲精品1234| 国产欧洲精品视频| 色婷婷av一区二区三区之红樱桃| 国产日韩欧美精品电影三级在线| 国产免费xxx| 中文字幕 在线观看| 欧美久久久久久蜜桃| 国产黑丝一区二区| 欧美freesextv| 97视频在线免费观看| 美女黄页在线观看| bt7086福利一区国产| 五月婷婷综合色| 草莓视频丝瓜在线观看丝瓜18| 色婷婷综合久久| 在线观看一区二区三区四区| 欧美日韩中文一区二区| 98精品国产高清在线xxxx天堂| 在线不卡免费视频| 99国产精品99久久久久久| 26uuu成人| 日本欧美日韩| 日韩国产高清视频在线| 久草视频在线资源站| 免费在线一区观看| 精品欧美一区二区三区久久久| 国产在线高潮| 欧美日韩综合在线免费观看| 噜噜噜在线视频| 欧美日韩岛国| 91免费精品视频| yiren22亚洲综合伊人22| 精品免费在线视频| 催眠调教后宫乱淫校园| 午夜国产一区| 91精品久久久久久久久不口人| 黄色在线视频观看网站| 精品magnet| 成人做爰69片免费| 一区二区三区网站| 国产日韩精品入口| 成人全视频高清免费观看| 欧美午夜xxx| 午夜视频在线观看国产| 欧美久久一区| 成人动漫视频在线观看免费| 老司机午夜在线| 欧美精品一级二级三级| 刘亦菲国产毛片bd| 蜜桃视频在线观看一区| 日韩精彩视频| 精品欧美日韩精品| 亚洲欧美一区二区三区情侣bbw| 欧美亚洲天堂网| 成人激情动漫在线观看| 亚洲精品久久久久久久蜜桃臀| 视频精品一区| 欧美大片在线免费观看| 成人免费视频国产| 亚洲一区二区精品久久av| 性一交一黄一片| 午夜精品久久99蜜桃的功能介绍| 亚洲www视频| 午夜dj在线观看高清视频完整版| 日韩一区二区电影| 久久久国产精品黄毛片| 成人一区二区三区| 欧美日韩亚洲一| 国产aⅴ精品一区二区三区久久| 欧美有码在线观看| 福利视频在线导航| 欧美日韩一级片网站| 国产精品成人69xxx免费视频| 国产久卡久卡久卡久卡视频精品| 91免费网站视频| 欧美专区视频| 欧美亚洲激情视频| www.av在线| 日韩三级中文字幕| 中文字幕一区二区三区精品| 国产人妖乱国产精品人妖| 欧美三级理论片| 一区二区在线| 久久精品ww人人做人人爽| 久久99久久99精品免观看软件| 中文字幕一精品亚洲无线一区 | 亚洲精品久久7777777| 亚洲日本韩国在线| 国产精品丝袜一区| 老熟女高潮一区二区三区| 国产精品久久久免费| 台湾成人av| 亚洲网址在线观看| 国产91在线播放| bt在线麻豆视频| 亚洲欧美激情另类校园| 99久久久久久久| 欧美日韩另类字幕中文| 欧美激情精品久久久久久免费| 成人深夜在线观看| 国产又黄又猛又粗| 精品1区2区3区4区| 一区二区三区我不卡| 精品久久对白| 91日韩在线播放| 丁香六月综合| 久久久久久久久久久免费| 岛国在线视频| 亚洲国产日韩欧美综合久久| 在线中文字幕网站| 午夜精品视频一区| 免费成人深夜蜜桃视频| 91色九色蝌蚪| 日批视频免费看| 久久99精品久久只有精品| www.日本在线播放| 中文字幕亚洲综合久久五月天色无吗''| 久久99精品久久久久久三级| 经典三级久久| 国产精品成人播放| 亚洲电影观看| 欧美激情三级免费| 国产高清一区二区三区视频| 亚洲视频在线观看网站| 欧美一级淫片aaaaaa| 91麻豆精品国产91久久久久久久久 | 狠狠入ady亚洲精品| 亚洲一区二区三区精品视频| 免费久久久久久久久| 国产欧美日韩亚洲| 日韩影片在线观看| 91麻豆桃色免费看| 日本a人精品| 国产精品色婷婷视频| 欧美精品高清| 日本成人激情视频| 蜜桃视频在线观看免费视频| 久久久久久久色| 四虎亚洲精品| 欧美成人精品h版在线观看| av男人的天堂在线| 亚洲无限av看| 黄色片在线播放| 亚洲摸下面视频| 男同在线观看| 精品无人区乱码1区2区3区在线| 好吊视频一二三区| 亚洲福利视频网站| 少妇av一区二区| 亚洲精品成人久久| 无码国产色欲xxxx视频| 亚洲国内高清视频| 午夜视频福利在线观看| 日韩高清a**址| 十八禁一区二区三区| 亚洲精品按摩视频| 神马久久精品| 国产一区二区三区在线看| 国产二区视频在线观看| 中文字幕免费精品一区| 最新97超碰在线| 久久伊人色综合| 在线观看三级视频| 午夜精品一区二区三区在线视| 123区在线| 2020欧美日韩在线视频| 黑人巨大亚洲一区二区久| 日本久久久久久| av一区在线播放| 成人国产精品av| 亚洲第一二区| 久久99精品久久久久久秒播放器| 免费看成人吃奶视频在线| 日韩国产欧美精品| 伊人色**天天综合婷婷| 久草视频国产在线| 美日韩精品视频| 91视频这里只有精品| 成人免费视频网站在线观看| 粉嫩av懂色av蜜臀av分享| 国产亚洲综合av| 天堂网av2018| 亚洲综合在线免费观看| www.毛片.com| 欧美午夜一区二区三区| 国产成人精品毛片| 日韩国产在线看| 欧美三级黄网| 国模视频一区二区| 日韩网站中文字幕| 2022国产精品| 一区二区三区韩国免费中文网站| 亚洲精品一卡二卡三卡四卡| 欧美色综合网| 不卡av免费在线| 国产黑丝在线一区二区三区| 在线观看国产网站| 国产精品国模大尺度视频| 国产在线观看免费av| 日本福利一区二区| 国产黄色av片| 宅男66日本亚洲欧美视频| av影院在线| 国产主播喷水一区二区| 蜜桃久久久久| 久久久成人精品一区二区三区| 99日韩精品| 五月天婷婷在线观看视频| 91论坛在线播放| 国产十六处破外女视频| 丝袜美腿一区| 2019av中文字幕| 国产精品亚洲综合在线观看| 久热这里只精品99re8久| 久久久久国产精品| 一区二区在线播放视频| www.久久精品| 外国一级黄色片| 欧美日韩在线直播| 欧洲视频在线免费观看| 久久久久久久久久久久久久久久久久av| 青青在线精品| 日本在线观看不卡| 国产毛片久久| 国产艳妇疯狂做爰视频| 亚洲美女屁股眼交3| 在线免费看av片| 亚洲午夜精品久久久久久性色| 国产第一页在线视频| 91中文精品字幕在线视频| 日韩aaaa| 亚洲xxxx2d动漫1| 2019国产精品| 99热只有这里有精品| 精品免费国产二区三区| mm1313亚洲国产精品美女| 国产美女被下药99| 不卡一区2区| www.99av.com| 亚洲国产成人午夜在线一区| 日韩在线 中文字幕| 精品视频久久久久久久| 成人女同在线观看| 俄罗斯精品一区二区| 激情综合网址| 中国黄色片视频| 亚洲电影一区二区| 亚洲免费不卡视频| 欧美日韩国产123| 7777精品| 拔插拔插海外华人免费| 成人国产精品视频| 精品91久久久| 日韩精品久久久久久久玫瑰园 | 一区二区三区四区五区视频在线观看| 亚洲一级视频在线观看| www.亚洲人.com| 99综合99| 免费网站永久免费观看| 成人精品免费网站| 国内免费精品视频| 亚洲日本欧美中文幕| 影音成人av| 麻豆视频传媒入口| 床上的激情91.| 久久国产视频播放| 亚洲视频精品在线| 亚洲欧美久久精品| 特大黑人娇小亚洲女mp4| 福利一区二区在线观看| 自拍偷拍欧美亚洲| 国产亚洲精品成人av久久ww | 成人情视频高清免费观看电影| 激情久久久久| theav精尽人亡av| 欧美天天综合网| 在线观看操人| 欧美二区在线看| 久久99精品久久久| 久久网一区二区| 亚洲视频axxx| 国产亚洲观看| 成人免费观看视频在线观看| 日本一区二区视频在线观看| 91中文字幕在线视频| 午夜伦理精品一区| 精品一区二区三| 丰满少妇中文字幕| 欧美日韩亚洲一区二区三区| yes4444视频在线观看| 成人av网站观看| 日本欧美一区二区| 国产精品二区一区二区aⅴ| 亚洲日本成人网| 日韩激情欧美| 88av.com| 亚洲国产日韩a在线播放| 黄色片免费在线| 99理论电影网| 日本vs亚洲vs韩国一区三区二区| 青青草原国产视频| 亚洲性av在线| 成人性生交大片免费看96| 国产一二三区av| 欧美日韩国产精品专区| 黄网站视频在线观看| 欧美不卡三区|