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<String,String> {
@Autowired
RedisTemplate redisTemplate;
@Override
public void onMessage(ConsumerRecord<String, String> 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注解