Lock4j 使用参数名作为锁 key 的一个注意点
Lock4j 使用参数名作为锁 key 的一个注意点最近遇到一个 Lock4j 加锁失败的问题。业务方法上使用了类似下面的注解Lock4j(keys{#bizNo},expire60000,acquireTimeout15000)按预期Lock4j 应该使用方法入参bizNo作为锁 key 的一部分。但实际排查时发现锁 key 中没有正确拿到bizNo导致生成的锁 key 不符合预期最终出现加锁失败。原因是#bizNo这种写法依赖运行时能够获取到真实的方法参数名。如果项目编译时没有保留参数名编译后的 class 文件中就拿不到bizNoLock4j 也就无法正确解析这个表达式。这个问题有两种解决方式。第一种是在 Maven 编译配置中开启参数名保留plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdconfigurationparameterstrue/parameters/configuration/plugin这样重新编译后class 文件中会保留真实参数名Lock4j 就可以正常解析#bizNo。第二种是改成参数下标写法不依赖真实参数名Lock4j(keys{#a0},expire60000,acquireTimeout15000)#a0表示方法的第一个参数。只要bizNo是第一个入参就可以正确取到对应的值。如果希望代码可读性更好可以使用第一种方式如果希望避免依赖编译参数可以使用第二种方式。总体来说使用#参数名作为 Lock4j key 时需要确认项目编译时是否保留了方法参数名。

相关新闻