Spring Webflow работает как конечный автомат, выполняя переходы между различными состояниями, которые могут иметь связанные представления.Не имеет смысла иметь несколько одновременно выполняемых переходов, поэтому SWF использует систему блокировки, чтобы гарантировать, что каждое выполнение потока (или диалог) обрабатывает только один HTTP-запрос за раз .
Не слишком зацикливайтесь на концепции ReentrantLock, она просто предотвращает ожидание того же потока в блокировке, которую он уже удерживает.
В ответ на ваш вопрос, только выполнение потока (конкретный экземпляр диалога) блокируется Spring Webflow на время обработки запроса.Сервер по-прежнему будет обрабатывать запросы от других пользователей или даже запросы от того же пользователя к другому выполнению потока.
Исключение LockTimeoutException сложно устранить, поскольку проблема с корнем не связана с тем, что поток вызывает исключение.Исключение LockTimeoutException возникает из-за того, что другой более ранний запрос занимает больше 30 секунд, поэтому было бы неплохо выяснить, почему более ранний запрос занял столько времени.
Идеи устранения неполадок:
- Реализуйте FlowExecutionListener, который измеряет, сколько времени занимает каждый запрос, и регистрируйте длинные запросы вместе с flowId, stateId и событием перехода, это позволит вам оттачивать длительные запросы.
- Один хороший способ избежатьСамо по себе LockTimeoutException - отключение кнопок и ссылок отправки с использованием javascript после нажатия кнопки / ссылки.Очевидно, что это не решает проблему начального 30-секундного + запроса.
Вы можете увеличить время ожидания для LockTimeoutException, но это не решает реальную проблему и приводит к ухудшению работы пользователя.,30-секундные запросы - это проблема.
Наконец, вы упомянули:
Я пытался выяснить, почему выше исключение возникает в некоторых случаях, когда есть только один щелчокили мы заходим на домашнюю страницу самого сайта.
Я предлагаю вам попытаться воссоздать проблему с открытым окном инструментов разработчика браузера, просматривая вкладку «Сеть», возможно, естьAJAX-запрос выполняется в фоновом режиме, который удерживает блокировку.