订单操作日志架构
类关系图
说明
OrderLogPoint 注解切入点,描述信息包含 订单sn,以及详细操作内容,支持Spel语法(即类似:#order.sn)
OrderService 订单业务类,订单操作时,注解对应信息,即可。示例代码如下:
@OrderLogPoint(description = "'订单['+#orderSn+']系统取消,原因为:'+#reason", orderSn = "#orderSn") public void systemCancel(String orderSn, String reason) { Order order = this.getBySn(orderSn); order.setOrderStatus(OrderStatusEnum.CANCELLED.name()); order.setCancelReason(reason); this.updateById(order); orderStatusMessage(order); }
OrderLogService 订单日志服务类,数据增删改查
OrderOperationLogAspect 切入点拦截类,对订单操作后的数据进行处理。根据注解中的信息,调用OrderLogService进行数据存储。
@After("@annotation(cn.lili.modules.order.order.aop.OrderLogPoint)")
在日志处理时,系统会另起一个线程进行处理,保证订单业务响应不受影响
/** * 保存日志 */ private static class SaveOrderLogThread implements Runnable { private final OrderLog orderLog; private final OrderLogService orderLogService; public SaveOrderLogThread(OrderLog orderLog, OrderLogService orderLogService) { this.orderLog = orderLog; this.orderLogService = orderLogService; } @Override public void run() { orderLogService.save(orderLog); } }
扩展说明
这是本系统推荐的一种日志机制,保证前端响应速度的同时,使得日志对整体架构的影响缩小到最小,在日后的其他文档中也会经常看到类似的文档。这里如果资源充沛,其实也可以使用MQ去实现。
流程图
日志流程描述
1、业务类操作,可能是系统,也可能是用户,在日志中会有对应的识别
2、业务类执行
4、切入点被执行,通常情况下执行与对应方法执行后,因为如果在其他位置执行,可能影响系统的正常流程。解析Spel语法,即类似#order.sn 这样的语法
5、线程池获取线程,传入要保存的数据
6、线程异步保存日志