java-mvel使用记录3——缓存刷新问题

起因

事情的起因源自上篇文章中源码分析的原因:要实现按需修改resolverFactory中缓存的参数,上篇及上上篇中为了实现功能添加了很多不必要的缓存,所以这篇文章中写一下我新的实现方法

改动点

去除对函数体的缓存

在上上篇文章中在缓存中保存了函数体,在新的解决方法中直接去掉就行了,因为不需要

添加对单个函数体的编译

由于采用的是按需添加缓存,但没有减少,所以当函数加入到resolverFactory的Map中后,除非是重启服务,否则只有全部清空,MapVariableResolverFactory中提供了clear()方法,下面是单个函数体编译的代码

	public MapVariableResolverFactory rebuildVariableResolverFactoryByStr(String expStr) {
        MapVariableResolverFactory resolverFactory = new MapVariableResolverFactory();
        ParserContext ctx = new ParserContext();
        try{
            char[] charArr = expStr.toCharArray();

            MVEL.eval(charArr, ctx, resolverFactory);
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
        return resolverFactory;
    }

实现逻辑

这里的实现逻辑是

  • 从缓存中获取原来的resolverFactory
MapVariableResolverFactory resolverFactory = (MapVariableResolverFactory) getVariableResolverFactory();
  • 将修改或新增的函数单独编译,调用上一步的编译方法
	//newFunction.getFunctionEntity()为函数体,也就是函数的字符串
 MapVariableResolverFactory newFuncResolverFactory = calculatorBuild.rebuildVariableResolverFactoryByStr(newFunction.getFunctionEntity());
  • 进行相关参数的合并
    这里进行3个参数的合并,下面一一说明:

    • 引用类合并
      必须说明,在进行操作的时候一定要判断新编译的函数中是否存在引用类,不存在和跳过这一步,原理是:在mvel的编译行为进行的时候会对你传入的函数字符串进行扫描&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值