2012-03-02 26 views
12

Chúng tôi đang sử dụng Spring Web Flow (2.0.9) trong môi trường Weblogic 10 clustured. Và trong quá trình sản xuất, chúng tôi đang nhận được rất nhiều LockTimeoutException: Không thể lấy khóa cuộc trò chuyện sau 30 giây.Spring Web Flow LockTimeoutException

Tôi đã cố gắng tìm ra lý do tại sao ngoại lệ trên xuất hiện trong một số trường hợp khi chỉ có một lần nhấp hoặc chúng tôi đang truy cập trang chủ của chính trang web đó.

Vui lòng tìm mã đang cố gắng khóa cho FlowController trong SWF. Những gì tôi không thể tìm ra là khóa là trên servlet đang được truy cập hoặc cái gì khác?

Hãy giúp hiểu trong ứng dụng web khi khóa này xảy ra tài nguyên nào thực sự bị khóa trong SWF?

Để hiểu khái niệm về ReentrantLock, vui lòng tham khảo liên kết bên dưới.

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

Xin cảm ơn trước.

Exception Stack Trace

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) 

Khóa thực hiện trong 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(); 
     } 
    } 
} 

Trả lời

18

Luồng web mùa xuân hoạt động như một máy trạng thái, thực thi chuyển tiếp giữa các trạng thái khác nhau có thể có chế độ xem được liên kết. Nó không có ý nghĩa khi có nhiều quá trình thực hiện đồng thời, do đó SWF sử dụng hệ thống khóa để đảm bảo rằng mỗi lần thực hiện luồng (hoặc cuộc hội thoại) chỉ xử lý một yêu cầu HTTP tại một thời điểm.

Đừng quá hung hăng về khái niệm ReentrantLock, nó chỉ ngăn cản cùng một chuỗi đang chờ trên một khóa mà nó đã giữ.

Trong câu trả lời cho câu hỏi của bạn, nó chỉ là thực thi luồng (trường hợp hội thoại cụ thể) bị khóa bởi Spring Webflow trong suốt thời gian xử lý yêu cầu. Máy chủ sẽ vẫn xử lý các yêu cầu từ những người dùng khác hoặc thậm chí các yêu cầu từ cùng một người dùng đến một quá trình thực thi luồng khác.

LockTimeoutException là khó khăn để khắc phục sự cố vì vấn đề gốc không phải là luồng ném ngoại lệ. Các LockTimeoutException xảy ra bởi vì một yêu cầu trước đó là dùng lâu hơn 30 giây, vì vậy nó sẽ là một ý tưởng tốt để tìm hiểu lý do tại sao các yêu cầu trước đó đã quá lâu.

ý tưởng Khắc phục sự cố:

  • Thực hiện một FlowExecutionListener đo lường bao lâu mỗi yêu cầu mất, và đăng nhập yêu cầu kéo dài cùng với sự kiện flowId, stateId và chuyển tiếp, điều này sẽ cho phép bạn trau dồi tại trên yêu cầu kéo dài chạy .
  • Một cách hay để tránh chính LockTimeoutException là tắt các nút gửi & liên kết bằng javascript khi một nút/liên kết đã được nhấp.Rõ ràng điều này không giải quyết được vấn đề của yêu cầu 30 giây + ban đầu.

Bạn có thể tăng thời gian chờ cho LockTimeoutException, nhưng điều đó không giải quyết được sự cố thực tế và dẫn đến trải nghiệm người dùng kém hơn. Yêu cầu 30 giây là vấn đề.

Cuối cùng, bạn đề cập:

Tôi đã cố gắng tìm ra lý do tại sao không ở trên ngoại lệ do thỏa thuận hợp một số trường hợp khi chỉ có một nhấp chuột duy nhất hoặc chúng ta đang truy cập vào trang quê hương của chính trang web .

Tôi khuyên bạn nên thử tạo lại sự cố với cửa sổ công cụ dành cho nhà phát triển của trình duyệt đang mở, xem tab 'Mạng', có thể có yêu cầu AJAX đang chạy trong nền đang giữ khóa.

0

Cố gắng vận dụng thời gian chờ. Dưới đây là mô tả cách thực hiện điều này https://jira.springsource.org/browse/SWF-1059. Có lẽ điều này sẽ giúp bạn tìm ra vấn đề thực sự ở đâu.

Các vấn đề liên quan