Spring-retry @Backoff delayExpression算术运算转时间单位的方法
写法可行性结论
你当前直接在占位符后拼接乘法运算的写法不可行。
Spring解析@Backoff的Expression属性时,默认只会对${}包裹的占位符做配置值替换,不会自动执行字符串中的算术运算。替换完成后得到的是类似2 * 60 * 1000的普通字符串,无法直接转换为延迟要求的数字类型,项目启动时会抛出数字格式转换异常。
正确实现方式
使用Spring SpEL表达式包裹运算逻辑即可,SpEL会在占位符替换完成后自动执行算术计算得到最终毫秒值,修正后的代码如下:
@Backoff( delayExpression = "#{${delay_in_minutes:2} * 60 * 1000}", maxDelayExpression = "#{${max_delay_in_minutes:10} * 60 * 1000}", multiplierExpression = "${multiplier:2.0}" )
- 逻辑说明:
#{}是SpEL表达式的边界标识,解析时会先替换内部${}占位符拿到配置的分钟数值,再执行*60*1000的单位转换计算,最终输出毫秒单位的延迟值。 - 注意事项:
multiplierExpression是退避倍率配置,无时间单位,不需要做单位转换,原有直接读取配置的写法可以保留。
如果不想在注解中写运算逻辑,也可以直接在配置文件中预先计算好毫秒单位的配置值,注解中直接读取对应毫秒配置项即可。
内容的提问来源于stack exchange,提问作者Shivaji Mutkule
相关产品推荐
相关产品推荐

