EJB 单例 bean 中的 ConcurrentAccessTimeoutException
ConcurrentAccessTimeoutException in EJB singleton bean
从 EJB 单例 bean 读取方法时出现以下异常。即使 60 秒超时设置,异常显示 5000MILLISECONDS。如何增加这个时间限制?
Caused by: javax.ejb.ConcurrentAccessTimeoutException: WFLYEJB0241:
EJB 3.1 PFD2 4.8.5.5.1 concurrent access timeout on TestBean- could
not obtain lock within 5000MILLISECONDS
下面是 bean 的超时设置:
@AccessTimeout(value = 60, unit = TimeUnit.SECONDS)
@Lock(LockType.READ)
public class TestBean {
Singleton bean,作为定义,只能被实例化一次。这意味着每次调用它的方法时,默认情况下都会在单例中设置一个@lock("write")。
如果已调用 bean 的方法,则所有请求都将由 EJB 容器序列化。
时间从 运行 请求序列化时开始。这次引用了@AccessTimeout。如果异步请求尚未完成并且您在@AccessTimeout 中设置的时间已经过去,则抛出异常。一些 EJB 容器使用它们自己的默认值,在您的情况下,用于 wildfly 的 EJB 容器就是出现在错误中的那个。
所以解决你的问题将取决于你想做什么,在每种情况下,都有很多可能的解决方案,但如果你只是想避免这一次,你应该使用像这样的注释这个:
@AccessTimeout(0),这个表示请求不能序列化,必须在单例空闲的情况下立即执行,否则会丢失。
我的建议是将此并发处理传递到方法级别,这样您就可以轻松地操作 bean。
从 EJB 单例 bean 读取方法时出现以下异常。即使 60 秒超时设置,异常显示 5000MILLISECONDS。如何增加这个时间限制?
Caused by: javax.ejb.ConcurrentAccessTimeoutException: WFLYEJB0241: EJB 3.1 PFD2 4.8.5.5.1 concurrent access timeout on TestBean- could not obtain lock within 5000MILLISECONDS
下面是 bean 的超时设置:
@AccessTimeout(value = 60, unit = TimeUnit.SECONDS)
@Lock(LockType.READ)
public class TestBean {
Singleton bean,作为定义,只能被实例化一次。这意味着每次调用它的方法时,默认情况下都会在单例中设置一个@lock("write")。
如果已调用 bean 的方法,则所有请求都将由 EJB 容器序列化。
时间从 运行 请求序列化时开始。这次引用了@AccessTimeout。如果异步请求尚未完成并且您在@AccessTimeout 中设置的时间已经过去,则抛出异常。一些 EJB 容器使用它们自己的默认值,在您的情况下,用于 wildfly 的 EJB 容器就是出现在错误中的那个。
所以解决你的问题将取决于你想做什么,在每种情况下,都有很多可能的解决方案,但如果你只是想避免这一次,你应该使用像这样的注释这个:
@AccessTimeout(0),这个表示请求不能序列化,必须在单例空闲的情况下立即执行,否则会丢失。
我的建议是将此并发处理传递到方法级别,这样您就可以轻松地操作 bean。