Запись в кеше не используется - PullRequest
5 голосов
/ 24 февраля 2012

У нас есть веб-приложение, использующее следующие технологии: 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] ...

Я некоторое время искал в Интернете, но не смог найти никакого решения. Кто-нибудь знает такую ​​ошибку?

Ответы [ 2 ]

3 голосов
/ 17 апреля 2012

Я осматривался, потому что у меня похожая проблема. Я нашел только два возможных объяснения: либо у вашего bean-компонента с состоянием истекло время ожидания (по умолчанию на AS7.1 - 5000 секунд), либо вы передаете ссылку на SFSB из одного потока в другой - который (предлагается на форум jboss не разрешен. Если первый, увеличьте тайм-аут или перехватите исключение. Если последний, jboss должен внедрить bean-компонент с состоянием, где это необходимо, вместо того, чтобы передавать его.

У меня проблема в том, что это не для меня. У меня есть только один bean-компонент с состоянием в тестовой настройке, который вводится отдельно в различные bean-компоненты без состояния - и я могу сгенерировать исключение в течение нескольких секунд после запуска тестового прогона. Я все еще пытаюсь выяснить, где я иду не так - если вы нашли альтернативное решение вашей проблемы, не могли бы вы опубликовать его, пожалуйста?

Ргдс, Джеймс

Я сузил до параллельного доступа - я могу сделать много последовательных запросов, но только несколько "параллельных", прежде чем это произойдет. (Я помещаю параллельный в кавычки, потому что я синхронизирую блокировку, удерживаемую eJb @SessionScoped, поэтому единственный возможный параллельный вызов - это метод getLock (), который я создал для него).

Я совершенно не понимаю, разрешает ли Weld одновременный доступ к @StateScoped @Stateful EJB. Я читал, что Seam сериализует доступ (а Weld родился из Seam), но не знаю, так ли это на самом деле. Если это так, то что-то еще заставляет мой боб умереть. Это легко воспроизводится через параллельный доступ из отдельных bean-компонентов @Stateless.

0 голосов
/ 24 апреля 2012

Хорошо, теперь я могу дать более точный ответ.Я не смог отказаться от одновременного доступа к сохраняющему состояние ejb, потому что мое приложение использует ajax, поэтому одновременные вызовы неизбежны.Я не могу вспомнить, где я нашел ссылку, но я понимаю, что параллельный доступ к bean-объекту с сохранением состояния должен быть сериализован контейнером под EJB3.1 - так что со мной все должно было быть в порядке.

В итоге я попыталсяпроследите мой путь через источник JBoss AS7 и, кажется, я нашел проблему (в настоящее время обсуждается здесь на форуме jboss AS7 ).Кажется, это ошибка - jboss синхронизирует доступ, только если ваш вызов находится в активной транзакции (BMT или CMT).Если это не так, то синхронизация завершается неудачно - и я не могу (насколько я понимаю) синхронизировать или заблокировать себя, потому что вы только когда-либо получаете доступ к прокси к бину, а не к самому базовому экземпляру.Синхронизация на прокси-сервере бесполезна для чего-либо, кроме потока (-ов), в котором существует прокси.

Обходной путь на данный момент заключается в обеспечении того, чтобы все вызовы, которые могут быть параллельными, были обернуты в транзакции.Я был приятно удивлен, обнаружив, что накладные расходы, связанные с частым открытием и закрытием транзакции в EXTENDED PersistenceContext, были очень малы, но я не особо настаивал на этом:)

Я подозреваю, что проблема затрагивает всеAS7 версии, но только подтвердили это на AS7.1.

...