我们有一个使用以下技术的Web应用程序:JSF 2.0,EJB 3.1,JPA 2.0,JBoss AS 7.1 Final
有时我们会无处不在地获得以下异常:
09:46:29,664 ERROR [org.jboss.ejb3.invocation] (http-10.99.0.10-10.99.0.10-8080-14) JBAS014134: EJB Invocation failed on component VehicleServiceBean for method public abstract java.util.List com.hji.common.service.VehicleService.findVehiclesBySearchCriteriaAndImporterIds(com.hji.common.domain.repository.VehicleRepository$VehicleSearchCriteria,java.lang.String,java.util.List,boolean): java.lang.IllegalStateException: JBAS014531: Cache entry {[36, -111,
-104, -128, 61, -17, 73, 29, -101, 52, -7, -106, 46, -3, 44, -22]} is not in use
at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:134) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:56) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:76) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:39) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
at org.jboss.as.ejb3.component.stateful.StatefulSessionSynchronizationInterceptor.releaseInstance(StatefulSessionSynchronizationInterceptor.java:197) ...
**Caused by: java.lang.IllegalStateException: JBAS014531: Cache entry {[36, -111, -104, -128, 61, -17, 73, 29, -101, 52, -7, -106, 46, -3, 44, -22]} is not in use**
at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:134) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:56) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:76) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:39) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final] ...
我一直在网上搜索一段时间但找不到任何解决方案。有人知道这种错误吗?
答案 0 :(得分:3)
我一直在四处寻找,因为我遇到了类似的问题。我只发现了两种可能的解释:要么你的有状态bean超时(在AS7.1上默认为5000秒),要么你将SFSB的引用从一个线程传递给另一个 - 这是(建议在the jboss forum是不被允许的。如果是前者,要么增加超时要么捕获异常。如果是后者,请让jboss在任何需要的地方注入有状态bean而不是传递它。
我遇到的问题是它不适合我。我在测试设置中只有一个有状态bean,它被单独注入到各种无状态bean中 - 我可以在开始测试运行的几秒钟内生成异常。我仍然试图追踪我出错的地方 - 如果你找到了解决问题的替代方案,你可以发布吗?
Rgds,詹姆斯
我已将其缩小到并发访问 - 我可以发出大量顺序请求,但在此之前只有少量“并发”请求。 (我将并发引号放在引号中,因为我正在同步@SessionScoped ejb持有的锁,因此唯一可能的并发调用是我在其上创建的getLock()方法。)
我对Weld是否允许或阻止对@SessionScoped @Stateful EJB的并发访问感到困惑。我读到Seam序列化访问(而Weld是从Seam诞生的),但不知道是否真的如此。如果是,那么其他东西导致我的bean死亡。通过从单独的@Stateless bean进行并发访问,它很容易重现。
答案 1 :(得分:0)
好的我现在可以提供我认为更准确的答案。我无法放弃允许并发访问有状态ejb,因为我的应用程序使用ajax,因此并发调用是不可避免的。我不记得我在哪里找到了引用,但据我所知,EJB3.1下的容器应该序列化对有状态bean的并发访问 - 所以我应该没问题。
我最终试图通过JBoss AS7源跟踪我的方式,并认为我发现了问题(目前正在讨论on the jboss AS7 forum)。它似乎是一个错误 - 如果您的呼叫在活动事务(BMT或CMT)内,jboss仅同步访问。如果不是,则同步失败 - 并且不可能(据我所知)同步或锁定自己,因为您只能访问bean的代理,而不是底层实例本身。在代理上进行同步对于代理所在的线程以外的任何其他内容都是无用的。
现在的解决方法是确保所有可以并发的调用都包含在事务中。我惊喜地发现在EXTENDED PersistenceContext上频繁打开和关闭事务的性能开销非常小 - 但我并没有真正推动它:)
我怀疑该问题会影响所有AS7版本,但仅在AS7.1上确认。