Springboot AOP注解方式获取请求参数及返回值并发送至rabbitMQ
业务需求需要将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相关推荐
- python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数
1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则: 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:" ...
- 一学就会:springMVC获取请求参数有哪几种方式?
文章目录 一.前言 二.初步认识 三.servletAPI 四.方法参数 五.@RequestParam 六.实体类 七.总结 一.前言 大家好,我是卷心菜,大二学生一枚. 大家在学习springMV ...
- postman发送post请求,用request.getParameter()获取请求参数
1.接口代码 @RequestMapping("notifyUrl") public void notifyUrl(HttpServletRequest request, Ht ...
- php slim get,php – 在Slim上获取请求参数
我正在尝试动态获取请求参数名称和值,但数组始终为空.这是获取路线: $app->get('/get/profile/:id_user', function ($id_user) use ($ap ...
- 获取请求参数通用方式|| 中文乱码问题||请求转发
1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数 1. String getParameter(String name):根据参数名称获取参数值 use ...
- Request_获取请求参数通用方式介绍
1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数 1. String getParameter(String name):根据参数名称 ...
- Request_获取请求参数通用方式演示
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...
- struts2获取请求参数的三种方式及传递给JSP参数的方式
接上一篇文章 package test;import com.opensymphony.xwork2.ActionSupport; import javax.servlet.http.*; impor ...
- 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数
1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景 ...
最新文章
- 使用VLC搭建RTSP服务器
- 用Eclipse给安卓应用进行签名
- wepy学习笔记之环境搭建
- 设计模式---5(建造者模式的概念及其实现,建造者模式的角色与职责,建造者模式和工厂模式的区别)
- Java JVM 汇编代码入门 GitChat链接
- Asterisk 1.4.42将成绝唱
- 程序员做到年薪60万也不去炫富,背后原因曝光,麻烦做个人吧
- python `__repr__`
- Javascript面试题一套
- macOS IKPictureTaker 图片选择器
- Effective_STL 学习笔记(十六) 如何将 vector 和 string 的数据传给遗留的API
- Word1——word 2016(笔记本预装)安装MathType 7教程
- iOS 15 H264硬编码码率变小,图像模糊
- android MediaPlayer m3u8 播放
- java怎么做rfif上位机软件,最简单的【上位机软件】详解
- 【一键安装+Docker】无视系统,十几个ROS版本任你选择
- css 取偶数节点_CSS选择器:奇偶匹配nth-child(even)
- 采样频率变化时,滤波器的性能会变差吗?
- MoveIt! 学习笔记13 - KDL/IKFAST/TRAC-IK运动学求解器区别
- 超简单 Python 头像戴圣诞帽教程
热门文章
- Cannot find module 'chalk'
- 华为5g服务器硬件供应商,华为发布5G多模终端芯片和商用终端
- 两个学院少了计算机相关专业招生?985华中科技大学计算机考研
- 研发二部二组-问题点归纳
- 中国黑色金属行业十四五产量需求及发展战略规划研究报告2021版
- 在Ubuntu20.04中继续使用linux版“网络调试助手”的方法
- 爬取百大弹幕,大家还是喜欢上罗老师的课!
- 酷睿i7 8550u属于什么级别 i7 8550u相当于台式机什么CPU
- [转载]蛋白质相互作用数据库
- 什么是超链接:下划线、样式、字体颜色、代码怎么做?