如何解决Groovy使用@TimedInterrupt时出现Unexpected input编译错误
当前代码触发编译报错的根本原因是 @TimedInterrupt注解没有绑定任何可修饰的目标元素。
Groovy的AST转换注解必须附着在类、方法、闭包等具备语义的代码结构上,无法单独在方法体内部孤立存在。原代码在buildInterrupt方法内仅写了一行注解,没有对应的修饰对象,编译器解析到该位置时无法识别语法结构,因此抛出“Unexpected input”的解析错误。
原代码还存在两处会导致运行失败的问题:
- 方法调用笔误:代码末尾调用
time_method(),但实际定义的方法名为timeout_method,会触发运行时“方法不存在”的错误 - 逻辑断裂:原本设计的
buildInterrupt()调用没有实际作用,既没有通过这个方法生成带超时控制的执行单元,也没有将超时规则绑定到目标方法上
补充说明:
@TimedInterrupt属于编译期生效的AST转换注解,无法在运行时动态为其他方法追加超时控制规则。注解的修饰关系在代码编译阶段就会被固定,不能通过返回注解本身的方式,给后续调用的方法自动叠加超时能力。
正确实现方式
最简化实现(直接修饰目标方法)
不需要额外的buildInterrupt方法,直接将@TimedInterrupt打在需要做超时控制的方法上即可:
import groovy.transform.TimedInterrupt import java.util.concurrent.TimeUnit @TimedInterrupt(value = 3L, unit = TimeUnit.MICROSECONDS) def timeout_method() { println 'This is for testing: ' } timeout_method()
保留buildInterrupt调用的实现
如果业务逻辑上必须保留buildInterrupt的调用流程,需要将注解绑定到方法内部定义的闭包上,返回经过AST转换的闭包供后续调用:
import groovy.transform.TimedInterrupt import java.util.concurrent.TimeUnit def buildInterrupt() { @TimedInterrupt(value = 3L, unit = TimeUnit.MICROSECONDS) def timeoutTask = { println 'This is for testing: ' } return timeoutTask } // 按流程调用buildInterrupt获取带超时控制的执行单元 def task = buildInterrupt() task()
注意:3微秒的超时阈值极短,正常代码的执行耗时很容易超过该阈值,运行上述代码后即可触发预期的
TimeoutException。如果测试时未触发异常,可适当将超时值调大(比如设置为1000、单位用毫秒)验证逻辑有效性。
内容的提问来源于stack exchange,提问作者Eerama19
相关产品推荐
相关产品推荐

