1.导入文件
里面的主题为test
2.写一个切面注解 使用注解来完成 日志的收集 (都写在controller层的 utils 中)
//在方法上标注
@Target(ElementType.METHOD)
//运行时间
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnn {
//注解
String value() default "";
}
写一个切面类
pjp.getTarget()是用来获取目标对象的 getclass 类 getName() 名称
pjp.getSignature() 获取目标方法 getName() 名称
@Component //被spring扫描
@Aspect //切面类
public class MyAop {
@Autowired
HttpServletRequest request;
@Autowired
KafkaTemplate kafkaTemplate;
@Around(value = "@annotation(com.jiasongfan.utils.MyAnn)")
public Object sendMessage(ProceedingJoinPoint pjp) throws Throwable {
//执行方法
Object proceed = pjp.proceed();
//类名
String className = pjp.getTarget().getClass().getName();
//方法名
String methodName = pjp.getSignature().getName();
//时间
String format = new SimpleDateFormat("yyyy-MM-dd HH:hh:ss").format(new Date());
//对象 使用git登录会出错
TbUser user = (TbUser) request.getSession().getAttribute("user");
//默认给一个对象 游客
String username="游客";
if (null!=user){
//如果有登录对象 则给对应的对象名称
username= user.getName();
}
String msg="用户:"+username+"类名:"+className+"方法名:"+methodName+"时间:"+format;
System.out.println(msg);
//通过kafka发送走
kafkaTemplate.sendDefault("logs",msg);
return proceed;
}
}
3.在service 层 有一个 消息 监听器 来接收消息
public class MyListenerACK implements AcknowledgingMessageListener{ @Autowired RedisTemplate redisTemplate; @Override public void onMessage(ConsumerRecord data, Acknowledgment acknowledgment) { String key = data.key(); String value = data.value(); System.out.println("获取的数据key是"+key+"value是"+value); if (null!=key){ if (key.equals("FLOOR_ADD")){ //添加 //转换 TbFloor floor = JSON.parseObject(value, TbFloor.class); //防止提交的时候重复消费 if (redisTemplate.opsForValue().setIfAbsent(floor.getToken(),1,1, TimeUnit.DAYS)){ //存入redis redisTemplate.opsForList().rightPush("addFloors",floor); } //手动提交 acknowledgment.acknowledge(); }else if (key.equals("logs")){ //把文件写入硬盘 .log FileUtil.writeFile("d:\logs\",data.value()); acknowledgment.acknowledge();//手工确认消息 } } } }
4.最后在执行的 方法 前面写上 @MyAnn注解



