2015-03-26 15 views
7

Tôi đang gặp sự cố với việc tắt Tomcat. Các yêu cầu đến trong khi hộp chứa servlet bị tắt dường như được giữ lại bởi đầu nối cho đến khi hoàn thành việc đóng container.Yêu cầu HTTP được giữ trong khi tắt Tomcat

Vấn đề là, servlet của chúng tôi có thể mất tới một phút để tắt, nghĩa là kết nối đến trong thời gian này được giữ trong tối đa một phút.

Hành vi này có đúng/mong đợi không?

Sẽ không lý tưởng hành vi tắt máy Tomcat được để

  1. sự cầu xin hiện kết thúc (như nó đã làm), nhưng
  2. từ chối các kết nối mới (thay vì chấp nhận và giữ chúng)?
+0

Bạn có thấy [this] (http://stackoverflow.com/questions/18444384/how-to-process-servlet-requests-during-long-shutdown) không? – user2138356

+0

xin vui lòng tham khảo câu trả lời này ở đây http://stackoverflow.com/a/9186070/957654 –

+0

Khó để xem những gì khác nó có thể làm. Nếu nó được cho là tắt nó phải ngừng xử lý yêu cầu một thời gian. Tại sao servlet của bạn mất một phút để dừng lại? – EJP

Trả lời

1

Đây là hành vi không mong muốn. Khi tắt nó sẽ dừng chấp nhận kết nối mới nhưng tôi đoán có một số thách thức kỹ thuật trong việc thực hiện nó. Moot, dù sao cũng được chú ý.

Làm sao chúng ta có quá khứ nó là thế này:

  1. Chúng tôi có các máy chủ web trước Tomcat của chúng tôi. Có được điều này tại chỗ, kế hoạch cho lâu dài nếu bạn không, là lời khuyên của tôi.
  2. có cách để yêu cầu máy chủ web thả một nút (ví dụ tomcat) từ danh sách các phiên bản rô bốt tròn.
  3. sau 3-4 phút mà nút tomcat sẽ miễn phí (không có kết nối mới và kết nối cũ hoàn tất). Chúng tôi có một máy chủ web tùy chỉnh dựa trên http://www.quickserver.org/ và nó cho phép các Tomcats back-end hoàn thành trong các kết nối quá trình, mặc dù dừng lại cho nó những cái mới.
  4. khi bảo trì hết, chúng tôi có một dịch vụ khác trên đại lý để thêm tomcat quay lại danh sách máy chủ đang hoạt động của (các) máy chủ web.

Trong trường hợp của chúng tôi, chúng tôi đã có cách để yêu cầu máy chủ tải lại cấu hình của chúng. Các máy chủ khác có vẻ giống nhau https://serverfault.com/questions/108261/how-to-make-modification-take-affect-without-restart-nginx

2

Đây là hành vi đúng. Khách hàng sẽ gửi yêu cầu miễn là máy chủ nhìn thấy máy chủ ở cổng đã cho.

Máy chủ sẽ chấp nhận yêu cầu miễn là nó đang hoạt động. Vì vậy, một số yêu cầu đã nhận được trong quá trình tắt máy, sẽ được nhận nhưng sẽ không được xử lý hoàn toàn.

Bạn sẽ cần phải triển khai cơ chế của riêng mình, nếu bạn muốn xử lý các yêu cầu này một cách duyên dáng. Bạn có thể sử dụng hàng đợi hoặc bộ lọc JMS. Đầu tiên yêu cầu nhận bộ lọc đầu tiên sẽ lưu trữ (db/serialize) yêu cầu và sau đó xử lý nó. Sau đó khi máy chủ khởi động lại, bạn có thể kiểm tra các yêu cầu không được xử lý, bạn có thể xử lý chúng hoặc thông báo cho khách hàng rằng nó không thành công.

5

Rõ ràng, bạn không phải là người duy nhất nhận thấy/nhận xét về hành vi này; xem bài đăng "tomcat-user" này:

(Trên thực tế, những điểm tương đồng giữa niêm yết và Câu hỏi của bạn gợi ý rằng có một số mối liên hệ giữa bản thân và Andry Eng ...)

Vì vậy, rõ ràng, đây là "dự kiến" hành vi trong một nghĩa nào đó.

Cho dù đó là "đúng" có phải là vấn đề không. Và nó là tranh luận nếu các nhà phát triển Tomcat không đồng ý với ý kiến ​​của bạn.

Và, đối với những gì nó có giá trị, đăng câu hỏi tu từ ở đây về hành vi "lý tưởng" cũng là tranh luận. Rõ ràng, các nhà phát triển Tomcat hoặc không đi chơi trong StackOverflow/"tomcat-người dùng" ... hoặc họ không sẵn sàng tranh luận vấn đề.


Vì vậy, bạn có thể có giải pháp nào?

  • này liên quan Q & Một giải thích một cách giải quyết - How to process servlet requests during long shutdown

  • Bạn có thể mở một vấn đề trên theo dõi vấn đề Tomcat. Các snag là vấn đề của bạn có thể ngồi trong danh sách trong nhiều tháng hoặc nhiều năm trước khi nó được giải quyết. Hoặc nó có thể được "bác bỏ".

    Tuy nhiên, có vẻ như không ai đã gửi vấn đề này như một vấn đề trong quá khứ.

  • Bạn có thể tìm ra cách sửa đổi Tomcat để từ chối yêu cầu mới trong khi tắt máy. Sau đó gửi các thay đổi (thử nghiệm) của bạn dưới dạng bản vá.

  • Bạn có thể thuê ai đó để thực hiện công việc cho bạn. Ví dụ: hãy xem những người/tổ chức được liệt kê tại đây: http://wiki.apache.org/tomcat/SupportAndTraining.