【发布时间】:2018-07-12 17:18:56
【问题描述】:
我已经在我的 java EE 应用程序中实现了一个断路器模式,因为它拥有一个状态(有多少失败的请求、平均响应时间、锁定/解锁等等),我将 inte 设置为@Stateful。
为了避免由于容器锁定而导致序列化出现问题,我添加了@ConcurrencyManagement(ConcurrencyManagementType.BEAN) 并确保所有操作都是线程安全的。
所以它目前看起来像这样:
@Stateful
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class CatalogBreaker extends Breaker {
但我还是得到了。
Caused by: javax.ejb.ConcurrentAccessTimeoutException: WFLYEJB0228: EJB 3.1 FR 4.3.14.1 concurrent access timeout on CatalogBreaker - could not obtain lock within 5000 MILLISECONDS
但是,如果我正确理解了所有内容,CuncurrencyManagement 注释应该将锁定委托给 bean 而不是容器......并且由于 CatalogBreaker 没有任何锁或任何类似的东西,那么我怎么会得到这个错误?
【问题讨论】:
-
查看 Javadoc 中的 ConcurrencyManagement 注释。看起来如果它应用于有状态 bean,您就不能使用 ConcurrencyManagementType.BEAN。
-
是的,我刚刚注意到了。但是,即使调用的函数非常基本并且应该很快,我仍然会遇到巨大的性能损失(这可能与此问题无关)
标签: concurrency ejb lock-timeout