Spring Web Flow LockTimeoutException - PullRequest
       12

Spring Web Flow LockTimeoutException

15 голосов
/ 02 марта 2012

Мы используем Spring Web Flow (2.0.9) в защищенной среде Weblogic 10.И в процессе производства мы получаем много LockTimeoutException: невозможно получить блокировку разговора через 30 секунд.

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

Пожалуйста, найдите код, который пытается заблокировать FlowController в SWF.Что я не могу понять, так это то, что блокировка находится на сервлете, к которому осуществляется доступ, или что-то еще?

Пожалуйста, помогите понять в веб-приложении, когда происходит эта блокировка, какой ресурс фактически заблокирован в SWF?*

Чтобы понять концепцию ReentrantLock, перейдите по ссылке ниже.

Что такое блокировка и концепция Re-entrant в целом?

Спасибо заadvance.

Трассировка стека исключений

org.springframework.webflow.conversation.impl.LockTimeoutException: Unable to acquire conversation lock after 30 seconds
    at org.springframework.webflow.conversation.impl.JdkConcurrentConversationLock.lock(JdkConcurrentConversationLock.java:44)
    at org.springframework.webflow.conversation.impl.ContainedConversation.lock(ContainedConversation.java:69)
    at org.springframework.webflow.execution.repository.support.ConversationBackedFlowExecutionLock.lock(ConversationBackedFlowExecutionLock.java:51)
    at org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:166)
    at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183)
    at org.springframework.webflow.mvc.servlet.FlowController.handleRequest(FlowController.java:174)
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)

Реализация блокировки в SWF

package org.springframework.webflow.conversation.impl;

import java.io.Serializable;
import java.util.concurrent.locks.ReentrantLock;

/**
 * A conversation lock that relies on a {@link ReentrantLock} within Java 5's <code>util.concurrent.locks</code>
 * package.
 * 
 * @author Keith Donald
 */
class JdkConcurrentConversationLock implements ConversationLock, Serializable {

    /**
     * The lock.
     */
    private ReentrantLock lock = new ReentrantLock();

    public void lock() {
        // ensure non-reentrant behaviour
        if (!lock.isHeldByCurrentThread()) {
            lock.lock();
        }
    }

    public void unlock() {
        // ensure non-reentrant behaviour
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}

Ответы [ 2 ]

20 голосов
/ 10 октября 2013

Spring Webflow работает как конечный автомат, выполняя переходы между различными состояниями, которые могут иметь связанные представления.Не имеет смысла иметь несколько одновременно выполняемых переходов, поэтому SWF использует систему блокировки, чтобы гарантировать, что каждое выполнение потока (или диалог) обрабатывает только один HTTP-запрос за раз .

Не слишком зацикливайтесь на концепции ReentrantLock, она просто предотвращает ожидание того же потока в блокировке, которую он уже удерживает.

В ответ на ваш вопрос, только выполнение потока (конкретный экземпляр диалога) блокируется Spring Webflow на время обработки запроса.Сервер по-прежнему будет обрабатывать запросы от других пользователей или даже запросы от того же пользователя к другому выполнению потока.

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

Идеи устранения неполадок:

  • Реализуйте FlowExecutionListener, который измеряет, сколько времени занимает каждый запрос, и регистрируйте длинные запросы вместе с flowId, stateId и событием перехода, это позволит вам оттачивать длительные запросы.
  • Один хороший способ избежатьСамо по себе LockTimeoutException - отключение кнопок и ссылок отправки с использованием javascript после нажатия кнопки / ссылки.Очевидно, что это не решает проблему начального 30-секундного + запроса.

Вы можете увеличить время ожидания для LockTimeoutException, но это не решает реальную проблему и приводит к ухудшению работы пользователя.,30-секундные запросы - это проблема.

Наконец, вы упомянули:

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

Я предлагаю вам попытаться воссоздать проблему с открытым окном инструментов разработчика браузера, просматривая вкладку «Сеть», возможно, естьAJAX-запрос выполняется в фоновом режиме, который удерживает блокировку.

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

Попробуйте манипулировать временем ожидания. Здесь описано, как это сделать https://jira.springsource.org/browse/SWF-1059. Может быть, это поможет вам найти настоящую проблему.

...