CAS 7.0.0-RC9中Groovy脚本执行耗时过长问题排查求助
CAS 7.0.0-RC9 Groovy属性仓库15秒延迟排查与解决方案
核心原因分析
结合现象(无Groovy配置时流程流畅,启用后固定15秒延迟),大概率是以下两类问题:
1. Groovy脚本首次执行的类加载/编译阻塞
CAS 7.x对Groovy脚本执行引擎做了调整,首次运行时需要动态编译脚本、加载类,若JVM类路径扫描缓慢或未启用脚本缓存,会触发明显延迟;另外,Groovy默认的编译日志、依赖解析操作也可能拖慢速度。
2. 隐性的DNS/IO阻塞操作
15秒是典型的DNS查询超时时间,大概率是脚本中(或Groovy初始化过程中)存在隐性网络调用,比如:
- 脚本调用了
InetAddress.getLocalHost()、URL.openConnection()这类需要解析主机名的代码 - 脚本依赖的类触发了网络相关的初始化逻辑
针对性解决方案
方案1:启用Groovy脚本缓存
在cas.properties中添加缓存配置,避免每次请求都重新编译脚本:
# 启用脚本缓存 cas.authn.attribute-repository.groovy.cache.enabled=true # 设置缓存过期时间(按需调整,示例为1小时) cas.authn.attribute-repository.groovy.cache.expiration=PT1H # 缓存最大容量 cas.authn.attribute-repository.groovy.cache.max-size=100
方案2:排查并移除脚本中的阻塞代码
检查你的custom-attr.groovy,确保没有任何隐性网络/IO操作:
- 删除所有涉及
InetAddress、网络URL的代码 - 避免在脚本中执行文件读取、非必要的系统属性查询
- 简化脚本到最简逻辑,示例:
import org.apereo.cas.authentication.principal.Principal def run(Object... args) { def principal = args[0] as Principal // 仅返回必要属性,无多余操作 return [ 'user_id': principal.id, 'role': 'USER' ] }
方案3:优化JVM与Groovy编译参数
在CAS启动参数中添加以下配置,优化Groovy类加载与编译速度:
# 关闭Groovy编译日志,减少IO开销 -Dgroovy.compiler.verbosity=0 # 启用Groovy类加载缓存优化 -Dgroovy.use.classvalue=true # 启用Groovy并行编译(按需调整) -Dgroovy.compiler.parallel=true
方案4:预编译Groovy脚本(彻底解决编译延迟)
将.groovy脚本编译成.class文件,放到CAS的类路径下替换原脚本:
- 用Groovy编译器编译脚本:
groovyc custom-attr.groovy - 将生成的
custom-attr.class放到CAS的类路径(如cas-server-webapp/src/main/resources/) - 修改
cas.properties中的脚本路径指向class文件:
cas.authn.attribute-repository.groovy.location=classpath:custom-attr.class
验证步骤
- 先排查脚本:注释所有非核心代码,仅返回固定属性,测试延迟是否消失
- 启用缓存后,首次请求可能仍有延迟,但后续请求应立即返回
- 开启DEBUG日志定位具体阻塞点:
在CAS的log4j2配置中添加:
从日志中查看是编译阶段还是执行阶段耗时。<Logger name="org.apereo.cas.authentication.attribute" level="DEBUG"/> <Logger name="groovy.lang.GroovyClassLoader" level="DEBUG"/>
内容的提问来源于stack exchange,提问作者artur mis
相关产品推荐
相关产品推荐

