Spring Web Flow LockTimeoutException
Nous sommes à l'aide de Spring Web Flow (2.0.9) dans le Weblogic 10 clustured de l'environnement. Et dans la production, nous obtenons beaucoup de LockTimeoutException : l'Impossibilité d'acquérir la conversation de verrouillage, après 30 secondes.
J'ai été à essayer de comprendre pourquoi exception ci-dessus vient, dans certains cas, lorsqu'il n'existe qu'un seul clic ou nous sommes accéder à la page d'accueil du site lui-même.
Veuillez trouver le code qui est d'essayer de verrouillage pour FlowController en SWF. Ce que je n'arrive pas à comprendre est que le verrou est sur la servlet, qui est en cours d'accès ou autre chose ?
S'il vous plaît aider à comprendre dans une application web lorsque ce verrou se produit la ressource est effectivement verrouillé en SWF ?
À comprendre le concept de ReentrantLock , veuillez consulter le lien ci-dessous.
Qu'est-ce que la Ré-entrant de verrouillage et le concept en général?
Merci d'avance.
Trace De Pile D'Exception
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)
De verrouillage de la mise en Œuvre en 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();
}
}
}
OriginalL'auteur Kunal Jha | 2012-03-02
Vous devez vous connecter pour publier un commentaire.
Spring Webflow fonctionne comme une machine d'état, l'exécution de transitions entre les différents états qui risquent d'avoir des vues associées. Il ne fait pas de sens d'avoir de multiples simultanément l'exécution de transitions, SWF utilise un système de verrouillage pour vous assurer que chaque exécution du flux (ou conversation) ne gère qu'une requête HTTP à un moment.
Ne soyez pas trop accroché sur le concept de ReentrantLock, il empêche le même thread en attente sur un verrou qu'il détient déjà.
En réponse à votre question, c'est seulement le flux d'exécution (la conversation spécifique instance) qui est verrouillé par Spring Webflow pour la durée de traitement de la requête. Le serveur continuera de traiter les demandes des autres utilisateurs, ou même les requêtes d'un même utilisateur à un autre flux d'exécution.
LockTimeoutException est difficile à résoudre parce que la racine du problème n'est pas le fil de jeter l'exception. Le LockTimeoutException se produit car une précédente demande de prendre plus de 30 secondes, de sorte qu'il serait une bonne idée de trouver la raison pour laquelle la demande antérieure a pris si longtemps.
Dépannage idées:
Vous pouvez augmenter le délai d'attente pour la LockTimeoutException, mais qui ne résout pas le problème réel et conduit à une mauvaise expérience utilisateur. De 30 secondes, les demandes sont le problème.
Enfin, vous avez mentionné:
Je suggère que vous essayez de reproduire le problème avec le navigateur web du développeur d'outils de la fenêtre ouverte, regardant l'onglet Réseau, peut-être il est une requête AJAX cours d'exécution en arrière-plan, qui est maintenant le verrou.
OriginalL'auteur Barry Pitman
Essayer de manipuler le délai d'attente. Ici est décrit comment ce faire https://jira.springsource.org/browse/SWF-1059. Peut-être que ce sera vous aider à trouver l'endroit où le vrai problème est.
OriginalL'auteur Łukasz Rzeszotarski