2012-03-02 22 views
12

हम वेबलॉगिक 10 क्लस्टर्ड वातावरण में स्प्रिंग वेब फ़्लो (2.0.9) का उपयोग कर रहे हैं। और उत्पादन में हमें बहुत सारे लॉकटाइमआउट अपवाद प्राप्त हो रहा है: 30 सेकंड के बाद वार्तालाप लॉक प्राप्त करने में असमर्थ।स्प्रिंग वेब फ्लो लॉकटाइमआउट अपवाद

मैं यह पता लगाने की कोशिश कर रहा हूं कि कुछ मामलों में उपरोक्त अपवाद क्यों होता है जब केवल एक क्लिक होता है या हम साइट के होम पेज तक पहुंच रहे हैं।

कृपया कोड जो SWF में FlowController के लिए लॉक करने के लिए कोशिश कर रहा है लगता है। मैं क्या नहीं समझ सकता कि लॉक सर्वलेट पर है जिसे एक्सेस किया जा रहा है या कुछ और?

एक वेब अनुप्रयोग में समझने के लिए जब इस लॉक होता है जो संसाधन वास्तव में SWF में लॉक हो गया है मदद कृपया?

ReentrantLock की अवधारणा को समझने के लिए, नीचे दिए गए लिंक को देखें।

What is the Re-entrant lock and concept in general?

अग्रिम धन्यवाद।

एक्सेप्शन स्टैक ट्रेस

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(); 
     } 
    } 
} 

उत्तर

18

स्प्रिंग Webflow एक राज्य मशीन के रूप में चल रही है, जो अलग-अलग राज्यों विचारों जुड़े हो सकता है के बीच संक्रमण को क्रियान्वित। यह कई समवर्ती रूप से निष्पादित संक्रमणों को समझने में नहीं आता है, इसलिए एसडब्ल्यूएफ यह सुनिश्चित करने के लिए लॉकिंग सिस्टम का उपयोग करता है कि प्रत्येक प्रवाह निष्पादन (या वार्तालाप) केवल पर एक HTTP अनुरोध को संभालता है।

भी मत हो ReentrantLock की अवधारणा पर लटका दिया, यह सिर्फ एक ही धागा एक ताला है कि यह पहले से ही रखती है पर इंतजार कर से बचाता है।

आपके प्रश्न के उत्तर में, यह केवल प्रवाह निष्पादन (विशिष्ट वार्तालाप उदाहरण) है जो अनुरोध हैंडलिंग की अवधि के लिए स्प्रिंग वेबफ्लो द्वारा लॉक किया गया है। सर्वर अभी भी अन्य उपयोगकर्ताओं से अनुरोधों को संभालेगा, या एक ही उपयोगकर्ता से अनुरोधों को एक अलग प्रवाह निष्पादन में भी संभाल देगा।

लॉकटाइमआउट अपवाद समस्या निवारण के लिए मुश्किल है क्योंकि रूट समस्या अपवाद को फेंकने वाला धागा नहीं है। LockTimeoutException तब होता है क्योंकि एक और पहले अनुरोध 30 सेकंड से अधिक समय ले रहा है, इसलिए यह पता लगाना अच्छा होगा कि पहले के अनुरोध को इतना लंबा क्यों लगा।

संबंधी समस्याओं का निवारण विचारों:

  • एक FlowExecutionListener जो उपायों कितनी देर तक प्रत्येक अनुरोध लेता लागू करें, और flowId, stateId और संक्रमण घटना के साथ, यह आप लंबे समय से चल अनुरोध पर प्रखर करने की अनुमति देगा लंबे अनुरोध लॉग इन करें ।
  • एक अच्छा तरीका LockTimeoutException खुद से बचने के लिए बटन जावास्क्रिप्ट का उपयोग करते हुए एक बार एक बटन/लिंक क्लिक किया गया है & लिंक प्रस्तुत निष्क्रिय करने के लिए है।जाहिर है यह प्रारंभिक 30-सेकंड + अनुरोध की समस्या का समाधान नहीं करता है।

आप लॉकटाइमआउट अपवाद के लिए टाइमआउट बढ़ा सकते हैं, लेकिन यह वास्तविक समस्या को हल नहीं करता है और इससे भी खराब उपयोगकर्ता अनुभव होता है। 30-सेकंड अनुरोध समस्या है।

अंत में, आपका उल्लेख किया:

मैं क्यों ऊपर है अपवाद कुछ मामलों में आता है यह पता लगाने की है जब वहाँ केवल एक क्लिक है कोशिश कर रहे हैं या हम साइट पर ही की मुख पृष्ठ तक पहुँच रहे हैं ।

मेरा सुझाव है कि आप ब्राउज़र के डेवलपर टूल विंडो के साथ समस्या को फिर से बनाने का प्रयास करें, 'नेटवर्क' टैब देखकर, शायद एक AJAX अनुरोध पृष्ठभूमि में चल रहा है जो लॉक धारण कर रहा है।

0

कोशिश लॉक कार्यान्वयन टाइमआउट हेरफेर करने के लिए। यहां बताया गया है कि यह https://jira.springsource.org/browse/SWF-1059 कैसे करें। हो सकता है कि इससे आपको यह पता चलने में मदद मिलेगी कि वास्तविक समस्या कहां है।