2011-08-22 46 views
33

Trong ứng dụng web của tôi, có một số yêu cầu kéo dài hơn 20 giây. Nhưng trong một số trường hợp, mã có thể dẫn đến vòng lặp vô hạn hoặc một cái gì đó tương tự làm chậm máy chủ.Thời gian chờ yêu cầu Tomcat

Tôi muốn đặt thời gian chờ yêu cầu trong 60 giây ở phía máy chủ. Điều này được thực hiện trong tomcat?

Cảm ơn bạn, Horatiu

+0

Bạn đang sử dụng 'Socket' và 'ServerSocket'? bởi vì nếu bạn đang có, bạn có thể đặt thời gian chờ ở đó bằng phương thức 'SetSoTimeout'. –

+0

Chỉ cần đồng bằng tomcat –

+0

@Eran, anh ấy đang phát triển ứng dụng web. Anh ta không thể acess socket máy chủ được mở bởi Tomcat. – AlexR

Trả lời

37

Với Tomcat 7, bạn có thể thêm StuckThreadDetectionValve để cho phép bạn xác định các chuỗi bị "kẹt".Bạn có thể thiết lập các van trong các yếu tố bối cảnh các ứng dụng mà bạn muốn làm việc phát hiện:

<Context ...> 
    ... 
    <Valve 
    className="org.apache.catalina.valves.StuckThreadDetectionValve" 
    threshold="60" /> 
    ... 
</Context> 

này sẽ viết một WARN nhập cảnh vào tomcat đăng nhập cho bất kỳ chủ đề nào cần chạy lâu hơn 60 giây, mà sẽ cho phép bạn xác định các ứng dụng và cấm chúng vì chúng bị lỗi.

Căn cứ vào source code bạn có thể viết van của riêng bạn cố gắng dừng luồng, tuy nhiên điều này sẽ ảnh hưởng đến hồ bơi và có no reliable way để dừng chuỗi trong Java mà không có sự hợp tác chủ đề ...

+1

Thay vì giết chết chủ đề đó (không đáng tin cậy như bạn đã đề cập), ném một runtimeexception là đủ –

9

Bạn có thể thiết lập thời gian mặc định ra trong server.xml

<Connector URIEncoding="UTF-8" 
    acceptCount="100" 
    connectionTimeout="20000" 
    disableUploadTimeout="true" 
    enableLookups="false" 
    maxHttpHeaderSize="8192" 
    maxSpareThreads="75" 
    maxThreads="150" 
    minSpareThreads="25" 
    port="7777" 
    redirectPort="8443"/> 
+0

Có cách nào chỉ ảnh hưởng đến đơn đăng ký của tôi không? –

+1

Bạn không thể thực hiện hết thời gian chờ từ máy chủ không may AFAIK Tôi có thể sai – Chris

+6

ConnectionTimeout là bao lâu Tomcat sẽ đợi dòng yêu cầu http sau khi kết nối được thiết lập. Nó không ảnh hưởng đến bao lâu máy chủ chờ yêu cầu để hoàn tất xử lý – Dave

19

Nếu bạn đang cố gắng để ngăn chặn một yêu cầu từ chạy quá lâu, sau đó thiết lập một thời gian chờ trong Tomcat sẽ không giúp bạn. Như Chris nói, bạn có thể đặt giá trị thời gian chờ toàn cầu cho Tomcat. Tuy nhiên, từ The Apache Tomcat Connector - Generic HowTo Timeouts, hãy xem phần Thời gian chờ trả lời:

JK cũng có thể sử dụng hết thời gian chờ trả lời yêu cầu. Thời gian chờ này không đo thời gian xử lý đầy đủ của phản hồi. Thay vào đó nó kiểm soát, cần bao nhiêu thời gian giữa các gói phản hồi liên tiếp.

Trong hầu hết các trường hợp, đây thực sự là điều bạn thực sự muốn. Hãy xem xét ví dụ: tải xuống đang chạy dài. Bạn sẽ không thể đặt hiệu lực thời gian trả lời toàn cầu là vì tải xuống có thể kéo dài trong nhiều phút. Hầu hết các ứng dụng mặc dù có thời gian xử lý giới hạn trước khi bắt đầu để trả lại phản hồi. Đối với những ứng dụng đó, bạn có thể đặt thời gian chờ trả lời rõ ràng là . Các ứng dụng không hài hòa với trả lời thời gian chờ là các ứng dụng loại hàng loạt, kho dữ liệu và báo cáo ứng dụng được dự kiến ​​sẽ quan sát thời gian xử lý dài.

Nếu JK hủy chờ phản hồi, vì thời gian chờ trả lời được kích hoạt, không có cách nào để dừng xử lý trên chương trình phụ trợ. Mặc dù bạn miễn phí tài nguyên xử lý trong máy chủ web của mình, yêu cầu sẽ tiếp tục đến chạy trên chương trình phụ trợ - mà không có cách nào để gửi lại kết quả sau khi hết thời gian chờ trả lời .

Vì vậy, Tomcat sẽ phát hiện rằng servlet đã không trả lời trong thời gian chờ và sẽ gửi lại một phản ứng cho người dùng, nhưng sẽ không dừng lại thread chạy. Tôi không nghĩ rằng bạn có thể đạt được những gì bạn muốn làm.

+0

Có lẽ trong jboss? Công cụ ứng dụng của Google đã thực hiện việc này, 30 giây hoặc một cái gì đó tương tự như vậy –

+3

Liên kết đã lỗi thời – rouan

1

Bài viết này nói về việc đặt thời gian chờ ở cấp máy chủ. http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways

Điều gì khiến ứng dụng đi vào vòng lặp vô hạn? Nếu bạn đang mở kết nối với các tài nguyên khác, bạn có thể muốn đặt thời gian chờ trên các kết nối đó và gửi phản hồi thích hợp khi những thời gian đó xảy ra.

+0

Tại sao có một sự đánh dấu về điều này? Câu trả lời có liên quan đến câu hỏi được đăng ở đó. – thcricketfan

+4

Tôi đoán nó đã được bình chọn bởi vì bài viết là khoảng ** phiên ** timeout –

-6

Thêm tomcat trong Eclipse

trong Eclipse, như máy chủ tomcat, nhấp đúp "Tomcat v7.0 Server tại Localhost", thay đổi các thuộc tính như trong thời gian ra các thiết lập từ 45 đến bất cứ điều gì bạn thích giây

+2

Bạn có thể trộn máy chủ bắt đầu thời gian chờ với yêu cầu thời gian chờ chính nó? –

+0

câu hỏi đang nói về thời gian chờ yêu cầu http, không phải là thời gian chờ bắt đầu/dừng –

-1

Đối với bất kỳ ai không thích không có giải pháp po sted trên như tôi sau đó bạn chỉ có thể thực hiện một bộ đếm thời gian cho mình và ngừng thực hiện yêu cầu bằng cách ném một ngoại lệ thời gian chạy. Một cái gì đó như dưới đây:

    try 
       { 
        timer.schedule(new TimerTask() { 
         @Override 
         public void run() { 
         timer.cancel(); 
         } 
        }, /* specify time of the requst */ 1000); 
       } 
       catch(Exception e) 
       { 
        throw new RuntimeException("the request is taking longer than usual"); 
       } 

hoặc tốt hơn là sử dụng java ổi timeLimiter here

+1

downvote là dành cho? – george

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