范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Groovy脚本极限优化

  前段时间开发的项目,项目需求要求支持业务人员频繁业务需求变更,业务要求每次策略变更第一时间线上生效。结合项目业务需要,我们选择进行业务领域抽象,把业务变更的需求提炼成为脚本操作,每次业务人员对业务的操作变成为业务域的逻辑操作,针对业务流程上的不同需求变更就变成一条条脚本规则的动态变更。
  因为团队主要开发语言是java,我们调研了QL Express 和 Groovy等脚本,最终选定Groovy脚本作为我们的脚本语言。我们使用Groovy支持业务人员频繁需求变更方案,首先对相关需求抽象出业务域,业务需求开发变成Groovy脚本,开发获取(转换)业务域数据接口。每次业务人员需求变更,我们修改业务脚本,线上获取到脚本变化,解析脚本语法树分析脚本依赖业务域,通过对应的业务域数据接口获取数据,然后加载数据执行对应脚本得到结果。
  本文主要关注对Java调用Groovy脚本所做的优化,本文的优化重点并不是对Groovy脚本执行性能的极致优化,就像我们调研选取Groovy脚本支持我们的业务需求综合性能和易用性综合考量的结果。Groovy调用优化
  下面说的所有关于Groovy优化都是基于GroovyShell执行Groovy脚本的极限优化,
  1.因为我们的业务流程涉及大量脚本调用,Groovy作为脚本语言,每次Java调用业务变更需求的Groovy脚本,Groovy都要经过重新编译生成Class,并new一个ClassLoader去加载一个对象,导致每次调用Groovy脚本执行时间大部分花在脚本编译上,而且也会导致大量的编译脚本Class对账,运行一段时间后将perm暴涨。
  2.高并发情况下,执行赋值binding对象后,真正执行run操作时,拿到的Binding对象可能是其它线程赋值的对象,会出现执行脚本结果混乱的情况。
  针对以上存在的问题,我对Groovy脚本调用进行了优化解决以上问题。
  1.首先我们通过给每个脚本生成一个md5,每次脚本首次执行,我们会把Groovy脚本生成的Script对象进行缓存,缓存设置一定的过期时间,保证下次同一个脚本执行直接调用Script就行。我们对每次Script执行通过锁保证每次执行的Binding不会出现多线程混乱的情况。
  以上优化对应的代码如下:1public class GroovyUtil { 2 3    private static GroovyShell groovyShell; 4 5    static { 6        groovyShell = new GroovyShell(); 7    } 8     9     10    public static Object execute(String ruleScript, Map varMap) { 11 12        String scriptMd5 = null; 13        try { 14            scriptMd5 = Md5Util.encryptForHex(ruleScript); 15        } catch (Exception e) { 16 17        } 18        Script script; 19        if (scriptMd5 == null) { 20            script = groovyShell.parse(ruleScript); 21        } else { 22            String finalScriptMd5 = scriptMd5; 23            script = GroovyCache.getValue(GroovyCache.GROOVY_SHELL_KEY_PREFIX + scriptMd5, 24                    () -> Optional.ofNullable(groovyShell.parse(ruleScript, generateScriptName(finalScriptMd5))), 25                    new TypeReference

跨界手机市场吉利被传收购魅族每经记者王晶每经编辑陈俊杰日前,有媒体报道称,吉利集团旗下手机公司星纪时代正与手机厂商魅族接触洽谈收购事宜。对此,每日经济新闻记者分别联系吉利和魅族方面进行核实,吉利方面不予置评,外媒科学家或探测到超长周期磁星据路透社华盛顿1月27日报道,科学家探测到一颗看起来密度极高的恒星,它的行为方式与此前所有观测到的恒星都不同他们怀疑这可能是一种奇异的新天体,此前它的存在只是个假设。报道称,该天体比亚迪官宣涨价,王传福底气何在?没啥大惊小怪的,涨不涨价是人家的事,买不买才是你该考虑的。又没有强买强卖,喜欢的人自然会考虑,不喜欢的人只不过是多一个喷点罢了因为美国海量印刷了美元,造成供给方原材料全线涨价。全世2分钟带你学习pygame第二课创建窗口代码注释importpygame可以访问pygame框架并导入pygame的所有功能。pygame。init()用于初始化pygame的所有必需模块。pygame。disp云服务器好还是vps好云服务器好还是vps好?云服务器是一种简单高效处理能力可弹性伸缩的计算服务,用户可以根据业务需求和伸缩策略,自动调整计算资源。vps是从服务器中划分出来的一部分专享服务器空间服务,力挺华为福耀第一次工业革命17601850年,甲午战争我们签定了屈辱条约!第二次工业革命18501950年,18国联军占领了中国。第三次工业革命19502006年(信息化),第四次工业革命也叫读懂开局之年成绩单科技创新激活发展动能2021年,科技创新如何有效增强经济动能?国家统计局等部委近期发布的2021年系列经济数据中,科技创新亮点突出。研发投入保持高增长2021年,科技创新在防控疫情推动高质量发展构建新Jpom简而轻的项目监控软件简而轻的低侵入式在线构建自动部署日常运维项目监控软件您为什么需要Jpom项目部署运维时,通用的方法是登录服务器,上传新的项目包,备份现有版本,执行相应命令。如果管理多个项目则重复操消费维权周报丨上周物流投诉增多,涉丢件快件损坏等问题实习生王沫初澎湃新闻记者吕新文上周,澎湃质量报告收到多起关于快递物流的投诉。其中,包括顺丰快递韵达快递百世快递中国邮政快递等被消费者投诉,反映的问题包括快递丢失快递损坏,及只能按照雷军回馈米粉,小米10s降价1010元,MIX4降价最狠短短一个月时间,小米12系列就卖出了十几万台,其中小米12Pro人气最高,销量已经突破9万台以上,算是骁龙8Gen1手机中的爆款了。笔者认为,新款手机配置虽好,但由于价格昂贵,加上2022手机品牌竞争激烈,即将发布的四款手机,每一款都是梦中情机手机圈的竞争真的越来越激烈了,不光是手机硬件的竞争,更有价格上的竞争。2022年即将发布的这几款手机,最值得大家期待。华为mate50Pro这款手机本应该在2021年10月份发布,
空洞骑士深度分析空洞骑士与大黄蜂空洞骑士这个游戏一开始的动画,便是显示出来一个被枷锁绑住的虫子,他的眼里显露出来了黄色的光亮,而之后便是面具破碎,呼啸声尖叫而出。接着便是看到三个面具发出了光亮又逐渐暗淡了下去。这黑暗之魂深度解析法兰不死队与深渊之战黑暗之魂这个游戏里有一个极其关键的概念传承。这种传承可以是血脉上的传承,例如,老魔女与她的子女们。这种传承可以是自身力量上的传承,例如被神族驯养的人类,至死也无法摆脱,小人群王分给黑暗之魂深度解析为什么说洛斯里克继承的是林德的遗产黑暗之魂这个游戏会根据玩家对不同的维度的理解,展现出来不同的故事内容。从不可知的神角度而言,它自然也是一个不可知的故事,而透露这个不可知的神则是游戏里隐藏的最深的角色蓓尔嘉。她在画linux之grep使用技巧显示不以开头的行greprumenz。txt显示开头的行greprumenz。txt从单个文件查找指定字符串greprumenz1。txt从多个文件查找指定字符串greprumen曹原发现石墨烯超导电性,华为以此研发碳基芯片有望突破美国制裁世界最大的芯片代工厂台积电曾经口出狂言虽然现在大陆有1万亿,但是也永远造不出一颗高端芯片,说这番话的底气,就是台积电现在掌握了生产硅基芯片最尖端的技术,在整个世界范围内几乎无人能够最终幻想7的宇宙观从核心危机到地狱犬的挽歌大家好,我是狗哥,趁着最终幻想7重制版的推出,我们看到了一个全新的最终幻想7的故事,而这个故事官方是有一个完整的前因后果的。只不过这个前因后果被埋藏在了不同的作品当中,例如前传的核宫囍恭喜吉祥如意故宫文化联合喜临门发布婚嫁系列床垫近日,北京故宫文化传播有限公司(以下简称故宫文化)联合喜临门开发的宫囍恭喜系列床垫新品发布会正式举行。宫囍恭喜系列床垫将故宫经典文物中的传统纹样加以提炼创新,匠心独具地运用于产品,Android性能与视图层次结构查看,检查布局性能对View对象层次结构的管理方式会显著影响应用的性能。本页介绍如何评估视图层次结构是否减慢了应用的速度,并且还提供了一些针对可能出现的问题的解决策略。布局和度量性能渲染流水线包含布linux之awk使用技巧打印文件的第一列awkprint1rumenz。txt打印文件的前两列awkprint1,2rumenz。txt打印文件的最后一列awkprintNFrumenz。txt打印文件的linux之我常用的20条命令(之二)file命令该命令用于判断接在file命令后的文件的基本数据,因为在Linux下文件的类型并不是以后缀为分的,所以这个命令对我们来说就很有用了。filerumenz。txt查看rulinux之我常用的20条命令(之一)cd切换目录cd。。切换到父级目录cdtmp切换到tmp目录cd切换到当前用户的家目录ls命令查看文件与目录的命令,list的缩写lsl列出长数据串,包含文件的属性与权限数据等ls