не удалось получить блокировку для компонента - PullRequest
8 голосов
/ 13 октября 2010

Иногда я получаю эту ошибку на компоненте области сеанса, но до сих пор не выяснил, что вызывает эту ошибку.Есть идеи?

ERROR [Exceptions] handled and logged exception
javax.el.ELException: org.jboss.seam.core.LockTimeoutException: could not acquire lock on @Synchronized component: importUser

Ответы [ 2 ]

16 голосов
/ 13 октября 2010

Компоненты области сеанса синхронизируются по умолчанию. Это означает, что Seam заботится о том, чтобы только один запрос за раз мог получить доступ к такому компоненту. Все остальные запросы должны ждать до завершения первого. Чтобы предотвратить голодание, ожидающие запросы имеют тайм-аут (см. org.jboss.seam.core.SynchronizationInterceptor для соответствующей реализации). Когда ожидающий запрос не получает доступ к компоненту до истечения времени ожидания, SynchronizationInterceptor выдает org.jboss.seam.core.LockTimeoutException.

При условии, что запросам A и B нужен ваш importUser компонент, и A является первым. Если A занимает много времени, чтобы закончить, B закончится в LockTimeoutException. Чтобы выяснить причину вашей проблемы, попробуйте выяснить, как запрос на importUser может занять больше времени, чем определенное время ожидания.

4 голосов
/ 08 сентября 2011

У меня была страница, где это случалось нечасто при большой нагрузке.Мне удалось уменьшить частоту этого, поместив эту аннотацию к классу объектов Seam:

@Synchronized(timeout=5000)

Это увеличивает тайм-аут до пяти секунд вместо того, что по умолчанию дает им Seam.Это просто пластырь, но я не собирался переписывать этого бегемота.

...