не удалось получить блокировку компонента

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

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

2 ответов


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

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


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

@Synchronized(timeout=5000)

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