Spring Event事件通知机制-日志整合实例

Spring Event事件通知机制-日志整合实例

本学习笔记主要是介绍Spring中的事件通知是如何实现的,并且对项目中如何使用spring event 实现日志监听

 

监听者模式

学习spring的事件通知机制肯定要先了解监听者模式(监听者模式和观察者模式有什么区别?

监听者模式包含了一个监听者Listener与之对应的事件Event,还有一个事件发布者EventPublish,过程就是EventPublish发布一个事件,被监听者捕获到,然后执行事件相应的方法  ----jwfy 简书

 

日志事件定义

@Getter
@AllArgsConstructor
public class SysLogEvent {
   private final SysLog sysLog;
}

异步事件监听

@Slf4j
@AllArgsConstructor
public class SysLogListener {
// 远程日志类
   private final RemoteLogService remoteLogService;

   @Async
   @Order
   @EventListener(SysLogEvent.class)
   public void saveSysLog(SysLogEvent event) {
      SysLog sysLog = event.getSysLog();
      remoteLogService.saveLog(sysLog, SecurityConstants.FROM_IN);
   }
}

日志注解类

 

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {

   /**
    * 描述
    *
    * @return {String}
    */
   String value();
}

发送异步日志事件 

@Slf4j
@Aspect
@AllArgsConstructor
public class SysLogAspect {

    private final ApplicationEventPublisher publisher;

    @SneakyThrows
    @Around("@annotation(sysLog)")
    public Object around(ProceedingJoinPoint point, SysLog sysLog) {
        String strClassName = point.getTarget().getClass().getName();
        String strMethodName = point.getSignature().getName();
        log.debug("[类名]:{},[方法]:{}", strClassName, strMethodName);
        com.wildcatcloud.wildcat.admin.api.entity.SysLog sysLogVo
                = SysLogUtils.getSysLog();
        sysLogVo.setTitle(sysLog.value());
        // 发送异步日志事件
        Long startTime = System.currentTimeMillis();
        Object obj = point.proceed();
        Long endTime = System.currentTimeMillis();
        sysLogVo.setTime(endTime - startTime);
        publisher.publishEvent(new SysLogEvent(logVo));
        return obj;
    }

}

 日志拓展

@UtilityClass
public class SysLogUtils {
   public SysLog getSysLog() {
      HttpServletRequest request = ((ServletRequestAttributes) Objects
            .requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
      SysLog sysLog = new SysLog();
      sysLog.setCreateBy(Objects.requireNonNull(getUsername()));
      sysLog.setType(CommonConstants.STATUS_NORMAL);
      sysLog.setRemoteAddr(HttpUtil.getClientIP(request));
      sysLog.setRequestUri(URLUtil.getPath(request.getRequestURI()));
      sysLog.setMethod(request.getMethod());
      sysLog.setUserAgent(request.getHeader("user-agent"));
      sysLog.setParams(HttpUtil.toParams(request.getParameterMap()));
      sysLog.setServiceId(getClientId());
      return sysLog;
   }

}

使用 

/**
 * 新增菜单
 *
 * @param sysMenu 菜单信息
 * @return success/false
 */
@SysLog("新增菜单")
@PostMapping
public R save(@Valid @RequestBody SysMenu sysMenu) {
   return new R<>(sysMenuService.save(sysMenu));
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值