业务需求需要将http请求参数与返回值采集,考虑使用AOP形式,获取到请求值与返回值之后将数据封装为json字符串发送到rabbitMQ中,消费者消费数据后将处理后的数据保存至mongodb或其他数据库中,以下为设置代码构建:

自定义注解

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemLog {}

Aspect

 //基于注解的切入点@Pointcut("@annotation(com.youjin.log.annotation.SystemLog)")public void serviceAspect() {}/*** 正常返回通知,拦截service层记录用户正常的日志* @param joinPoint*/@SuppressWarnings({ "rawtypes", "unchecked" })@AfterReturning(returning = "ret",pointcut = "serviceAspect()")public void doAfter(JoinPoint joinPoint,Object ret) throws Exception {Result result = (Result) ret;ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();//获取参数Map param = (Map)joinPoint.getArgs()[0];//获取方法
//        String classType = joinPoint.getTarget().getClass().getName();
//        Class<?> clazz = Class.forName(classType);
//        String clazzName = clazz.getName();
//        String methodName = joinPoint.getSignature().getName(); //获取方法名称
//        Object[] args = joinPoint.getArgs();//参数
//        Map<String, Object> nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName, args);//获取被切参数名称及参数值
//        System.out.println(nameAndArgs.toString());LogEntity logEntity = new LogEntity();//
//
////发送消息到rabbitMq
//        System.out.println(hislogEntity.toString());try {rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());rabbitTemplate.setExchange(env.getProperty("log.user.exchange.name"));rabbitTemplate.setRoutingKey(env.getProperty("log.user.routing.key.name"));Message message = MessageBuilder.withBody(objectMapper.writeValueAsBytes(logEntity)).setDeliveryMode(MessageDeliveryMode.PERSISTENT).build();message.getMessageProperties().setHeader(AbstractJavaTypeMapper.DEFAULT_CONTENT_CLASSID_FIELD_NAME, MessageProperties.CONTENT_TYPE_JSON);rabbitTemplate.convertAndSend(message);} catch (JsonProcessingException e) {e.printStackTrace();}

MQ配置

@Configuration
public class RabbitmqConfig {private static final Logger log= LoggerFactory.getLogger(RabbitmqConfig.class);@Autowired
private Environment env;@Autowired
private CachingConnectionFactory connectionFactory;@Bean
public RabbitTemplate rabbitTemplate() {connectionFactory.setPublisherConfirms(true);connectionFactory.setPublisherReturns(true);RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMandatory(true);rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {log.info("消息发送成功:correlationData({}),ack({}),cause({})", correlationData, ack, cause);}});rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {@Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {log.info("消息丢失:exchange({}),route({}),replyCode({}),replyText({}),message:{}", exchange, routingKey, replyCode, replyText, message);}});return rabbitTemplate;}@Bean
public Queue logUserQueue(){return new Queue(env.getProperty("log.user.queue.name"),true);
}
@Bean
public DirectExchange logUserExchange(){return new DirectExchange(env.getProperty("log.user.exchange.name"),true,false);
}
@Bean
public Binding logUserBinding(){return BindingBuilder.bind(logUserQueue()).to(logUserExchange()).with(env.getProperty("log.user.routing.key.name"));
}

}

业务service层

@Service
public class LogTsetService {@SystemLog
public Result findTestdata(Map map){Result result = new Result();result.setContent("helooworld");result.setStatus("ok");return result;
}}

Springboot AOP注解方式获取请求参数及返回值并发送至rabbitMQ相关推荐

  1. python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数

    1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则: 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:" ...

  2. 一学就会:springMVC获取请求参数有哪几种方式?

    文章目录 一.前言 二.初步认识 三.servletAPI 四.方法参数 五.@RequestParam 六.实体类 七.总结 一.前言 大家好,我是卷心菜,大二学生一枚. 大家在学习springMV ...

  3. postman发送post请求,用request.getParameter()获取请求参数

    1.接口代码 @RequestMapping("notifyUrl")   public void notifyUrl(HttpServletRequest request, Ht ...

  4. php slim get,php – 在Slim上获取请求参数

    我正在尝试动态获取请求参数名称和值,但数组始终为空.这是获取路线: $app->get('/get/profile/:id_user', function ($id_user) use ($ap ...

  5. 获取请求参数通用方式|| 中文乱码问题||请求转发

    1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数 1. String getParameter(String name):根据参数名称获取参数值    use ...

  6. Request_获取请求参数通用方式介绍

    1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数             1. String getParameter(String name):根据参数名称 ...

  7. Request_获取请求参数通用方式演示

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  8. struts2获取请求参数的三种方式及传递给JSP参数的方式

    接上一篇文章 package test;import com.opensymphony.xwork2.ActionSupport; import javax.servlet.http.*; impor ...

  9. 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数

    1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景 ...

最新文章

  1. 使用VLC搭建RTSP服务器
  2. 用Eclipse给安卓应用进行签名
  3. wepy学习笔记之环境搭建
  4. 设计模式---5(建造者模式的概念及其实现,建造者模式的角色与职责,建造者模式和工厂模式的区别)
  5. Java JVM 汇编代码入门 GitChat链接
  6. Asterisk 1.4.42将成绝唱
  7. 程序员做到年薪60万也不去炫富,背后原因曝光,麻烦做个人吧
  8. python `__repr__`
  9. Javascript面试题一套
  10. macOS IKPictureTaker 图片选择器
  11. Effective_STL 学习笔记(十六) 如何将 vector 和 string 的数据传给遗留的API
  12. Word1——word 2016(笔记本预装)安装MathType 7教程
  13. iOS 15 H264硬编码码率变小,图像模糊
  14. android MediaPlayer m3u8 播放
  15. java怎么做rfif上位机软件,最简单的【上位机软件】详解
  16. 【一键安装+Docker】无视系统,十几个ROS版本任你选择
  17. css 取偶数节点_CSS选择器:奇偶匹配nth-child(even)
  18. 采样频率变化时,滤波器的性能会变差吗?
  19. MoveIt! 学习笔记13 - KDL/IKFAST/TRAC-IK运动学求解器区别
  20. 超简单 Python 头像戴圣诞帽教程

热门文章

  1. Cannot find module 'chalk'
  2. 华为5g服务器硬件供应商,华为发布5G多模终端芯片和商用终端
  3. 两个学院少了计算机相关专业招生?985华中科技大学计算机考研
  4. 研发二部二组-问题点归纳
  5. 中国黑色金属行业十四五产量需求及发展战略规划研究报告2021版
  6. 在Ubuntu20.04中继续使用linux版“网络调试助手”的方法
  7. 爬取百大弹幕,大家还是喜欢上罗老师的课!
  8. 酷睿i7 8550u属于什么级别 i7 8550u相当于台式机什么CPU
  9. [转载]蛋白质相互作用数据库
  10. 什么是超链接:下划线、样式、字体颜色、代码怎么做?