首页 > 其他分享 >spEl解析

spEl解析

时间:2023-08-08 14:34:07浏览次数:29  
标签:point lock redis spEl key 注解 解析

前言

  有个需求要求做幂等,按之前的做法,在业务代码中使用 redis 根据幂等标识获取值,有则证明该入参短时间内已触发过,滤过。然后再业务结尾,将幂等标识发送个redis

  注:以上幂等有个问题,两个相同的入参同时进入,同样再redis上是找不到幂等标识的,此时第一个入参没有将幂等标识发送到redis上 第二个入参同样也能进入业务代码,会有巨大的问题,所以,基于该问题的考虑,我决定使用redis分布式锁,来做幂等

  这段代码与业务代码其实毫无关联,趁着开发时间有余,把这一块封装出来使用aop完成。

  此时需要一个注解,需要从方法的入参中拿到需要幂等标识,如果写死,这个注解的通用性就此吃了屎,所以想到使用spEl去取,入参中的值,spring的部分注解是自动支持spEl取值的,自定义的注解就别想了,需要自己手动搞。

代码

幂等注解

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {
    String key();
}

aop实现

    @Around("idempotentPointCut() && @annotation(idempotent)")
    public Object around(ProceedingJoinPoint point, Idempotent idempotent) throws Throwable {
        String key = "Idempotent" + parseSpEl(point, idempotent.key());
        RLock lock = redissonClient.getLock(key + "lock");
        try {
            if (lock.tryLock(30, 60,TimeUnit.SECONDS)){
                return point.proceed();
            }
        } catch (Throwable e) {
            log.error("获取分布式锁过程报错!!", e);
            lock.unlock();
            throw e;
        } finally {
            lock.unlock();
        }
    }

    private Object parseSpEl(ProceedingJoinPoint point, String key) {
        MethodSignature signature = (MethodSignature) point.getSignature();
        List<String> paramNameList = Arrays.asList(signature.getParameterNames());
        List<Object> paramList = Arrays.asList(point.getArgs());

        //将方法的参数名和参数值一一对应的放入上下文中
        EvaluationContext ctx = new StandardEvaluationContext();
        for (int i = 0; i < paramNameList.size(); i++) {
            ctx.setVariable(paramNameList.get(i), paramList.get(i));
        }

        // 解析SpEL表达式获取结果
        return spelParser.parseExpression(key).getValue(ctx);
    }

 

标签:point,lock,redis,spEl,key,注解,解析
From: https://www.cnblogs.com/cgdq/p/17614191.html

相关文章

  • 端口映射软件可以做什么? 快解析如何设置端口映射?
    说到端口映射,首先说说nat。简单地说,nat就是在局域网内部网络中使用内部地址,而当内部节点要与外部网络进行通讯时,就在网关处,将内部地址替换成公用地址,从而在外部公网(internet)上正常使用,nat可以使多台计算机共享Internet连接,这一功能很好地解决了公共IP地址紧缺的问题。通过这种方法......
  • odoo系统局域网及外网访问?快解析内网穿透方案教程
    首先,带着大家了解一下odoo是什么?前身是OpenERP。Odoo是一个广泛使用的开源ERP(企业资源规划)系统,它的主要特点之一就是高度模块化的设计。此套装可满足中小型企业的一切应用需求,例如,企业基本的进销存、采购、销售、MRP生产制造、产品保质量保障、企业招聘、员工合同、休假、午餐管......
  • odoo系统局域网及外网访问?快解析内网穿透方案教程
    首先,带着大家了解一下odoo是什么?前身是OpenERP。Odoo是一个广泛使用的开源ERP(企业资源规划)系统,它的主要特点之一就是高度模块化的设计。此套装可满足中小型企业的一切应用需求,例如,企业基本的进销存、采购、销售、MRP生产制造、产品保质量保障、企业招聘、员工合同、休假、午餐管......
  • Java内存解析(转)
    栈、堆、常量池等虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同。本文将深入Java核心,简单讲解Java内存分配方面的知识。首先我们先来讲解一下内存中的各个区域。 stack(栈):存放基本类型的数据和对象的引用,即存放变量。如果存放的事基本类型的数据(非静态变量),则直接......
  • 编织人工智能:机器学习发展历史与关键技术全解析
    本文全面回顾了机器学习的发展历史,从早期的基本算法到当代的深度学习模型,再到未来的可解释AI和伦理考虑。文章深入探讨了各个时期的关键技术和理念,揭示了机器学习在不同领域的广泛应用和潜力。最后,总结部分强调了机器学习作为一种思维方式和解决问题的工具,呼吁所有参与者共同探索......
  • 三. JSON数据解析(parse)
    三.JSON数据解析(parse)专栏目录一.JSON二.JSON基础数据结构三.JSON数据解析(parse)0.引我们现在已经将JSON的基础数据结构进行了C语言抽象了,就像已经准备好了房子,就等着入住了,一般来说,JSON数据是以字符串形式由外部传入的,被解析的对象就是这个JSON格式的......
  • Java HTTP请求 如何获取并解析返回的HTML内容
    JavaHTTP请求如何获取并解析返回的HTML内容在Java开发中,经常会遇到需要获取网页内容的情况。而HTTP请求是实现这一目标的常用方法之一。本文将介绍如何使用Java进行HTTP请求,并解析返回的HTML内容。JavaHTTP请求如何获取并解析返回的HTML内容首先,我们需要导入相关的Java类库:j......
  • Linux jq 命令讲解与实战操作(json字符串解析工具)
    目录一、概述二、jq命令安装三、jq命令语法与示例详解1)基本用法2)常用选项3)查询和过滤1、选择字段2、过滤3、遍历数组4、组合操作4)修改和创建1、修改字段值:2、创建新字段:3、组合操作:4、条件修改5)运算符1、数值运算2、比较运算:3、逻辑运算:4、条件运算:6)变量和条件1、使用变量:2、条......
  • Flink源码解析(零)——源码解析系列随笔说明
    00、博主仅是数据开发及数仓开发工程师,出于提升自身对Flink系统原理掌握考虑,自愿花费精力整理源码解析系列随笔,并非专业Flink系统开发人员,在源码解析过程中出现非专业行为望见谅。希望Flink系统开发专业人员多提意见,不胜感激。01、Flink源码解析系列随笔主要基于Flink1.17.1版本......
  • linux内网穿透应用场景有哪些?快解析有什么用处?
    随着网络技术的不断发展,无论是工作上还是在生活中人们对网络的依赖和需求越来越高。Linux内网穿透作为一种创新的解决方案,为我们提供了无限可能。首先我们了解一下Linux操作系统。Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程......