EJB单例Bean出现ConcurrentAccessTimeoutException,超时配置未生效如何调整?
解决EJB单例Bean@AccessTimeout注解不生效的问题
你遇到的这个情况太常见了——明明在代码里用@AccessTimeout(value = 60, unit = TimeUnit.SECONDS)设置了60秒的并发访问超时,结果触发的却是WildFly默认的5000毫秒(也就是5秒)超时异常。这主要是两个原因:要么是你的注解位置不对没生效,要么是WildFly容器的默认配置优先级盖过了你的代码设置。下面给你几个可行的解决方案:
一、先检查注解的放置位置
你现在把@AccessTimeout放在了类上,这本身没问题,但有时候容器对类级注解的识别可能有偏差,或者你需要针对特定方法单独设置。可以试试这两种调整:
- 如果是给整个类的所有方法生效,确认类上的
@Lock(LockType.READ)和@AccessTimeout搭配正确——READ锁的并发超时配置需要容器正确识别; - 直接把注解放到具体的业务方法上,比如:
这种方法更直接,能确保该方法的超时配置被容器优先读取。@Lock(LockType.READ) @AccessTimeout(value = 60, unit = TimeUnit.SECONDS) public void yourBusinessMethod() { // 你的业务逻辑代码 }
二、修改WildFly的容器默认配置
WildFly默认给EJB单例Bean设置的并发访问超时就是5秒,这个全局配置可能会覆盖你的注解设置。你需要修改服务器的配置文件(比如standalone.xml或者domain.xml,根据你用的是独立模式还是域模式):
- 打开配置文件,找到
<subsystem xmlns="urn:jboss:domain:ejb3:xxx">这个EJB子系统配置块(xxx是版本号,比如19.0); - 在这个块里面添加或修改
<singleton-bean>节点,设置默认超时为60秒(注意单位是毫秒):<subsystem xmlns="urn:jboss:domain:ejb3:19.0"> <!-- 其他已有配置保持不变 --> <singleton-bean default-access-timeout="60000"/> <!-- 其他已有配置保持不变 --> </subsystem> - 保存配置后重启WildFly,新的默认超时就会生效了。
三、直接用毫秒值设置注解
有时候可能因为TimeUnit.SECONDS的解析问题导致注解没生效,你可以跳过单位转换,直接用毫秒值写进注解里:
@AccessTimeout(value = 60000) // 直接写60000毫秒,等价于60秒 @Lock(LockType.READ) public class TestBean { // 类内容 }
修改完成后,再调用方法测试,如果异常提示的超时时间变成60000毫秒,就说明配置生效啦。
内容的提问来源于stack exchange,提问作者Valsaraj Viswanathan
相关产品推荐
相关产品推荐

