EJB单例bean中的ConcurrentAccessTimeoutException

时间:2018-05-16 06:53:53

标签: ejb

从EJB singleton bean读取方法时获取以下异常。即使60秒超时设置,例外显示5000MILLISECONDS。如何增加这个时间限制?

  

引起:javax.ejb.ConcurrentAccessTimeoutException:WFLYEJB0241:   EJB 3.1 PFD2 4.8.5.5.1 TestBean上的并发访问超时 - 可以   没有在5000MILLISECONDS内获得锁定

以下是bean的超时设置:

@AccessTimeout(value = 60, unit = TimeUnit.SECONDS)
@Lock(LockType.READ)
public class TestBean {

1 个答案:

答案 0 :(得分:1)

Singleton bean作为定义,只能实例化一次。这意味着默认情况下,每次调用方法时,都会在单例中设置@lock(" write")。

如果已经调用了bean的方法,那么所有请求都将由EJB容器序列化。

请求序列化时,时间开始运行。这次引用@AccessTimeout。如果尚未完成异步请求,并且已经传递了在@AccessTimeout中设置的时间,则抛出异常。一些EJB容器使用它们自己的默认值,在您的情况下,用于wildfly的EJB CONTAINER是出现在错误中的那个。

所以要解决你的问题取决于你想做什么,并且在每种情况下,都有很多可能的解决方案,但是如果你只是想避免这个时候,你应该使用这样的注释:

@AccessTimeout(0),这意味着请求无法序列化,如果单例是空闲的,则必须立即执行,否则将丢失。

我的建议是将此并发处理传递给方法级别,以便您可以轻松地操作bean。