2011-09-17 33 views
37

Có thể ai đó vui lòng giải thích chuỗi là gì theo yêu cầu và chuỗi cho mỗi kết nối? Mô hình nào servlet hoạt động? Các luồng được phân bổ như thế nào để xử lý các yêu cầu HTTP? Đó là chủ đề/yêu cầu hoặc kết nối?Chủ đề được phân bổ để xử lý yêu cầu Servlet như thế nào?

Và giả sử nếu tôi muốn thực hiện tác vụ tốn thời gian trong phương pháp doGet()Servlet của tôi một cách không đồng bộ, tôi bắt đầu một chuỗi mới bằng cách sử dụng trình thực thi Java để các phép tính dài được thực hiện trong một chuỗi riêng biệt và phản hồi được gửi đi ngay lập tức.

Bây giờ, điều đó có đảm bảo rằng tôi đã giải phóng chuỗi đã xử lý số HttpServletRequest của mình hoặc nó vẫn đang được sử dụng vì một chuỗi con vẫn đang chạy?

Trả lời

42

Mỗi yêu cầu có nghĩa là khi yêu cầu HTTP được tạo, một chuỗi được tạo hoặc truy xuất từ ​​một hồ bơi để phục vụ. Một luồng phục vụ toàn bộ yêu cầu. Chủ đề cho mỗi kết nối sẽ giống nhau ngoại trừ chuỗi được sử dụng cho toàn bộ kết nối, có thể là nhiều yêu cầu và cũng có thể có nhiều thời gian chết giữa các yêu cầu. Các thùng chứa Servlet là chủ đề theo yêu cầu. Có thể có một số triển khai cung cấp luồng cho mỗi kết nối, nhưng tôi không biết, và có vẻ như nó sẽ rất lãng phí.

Tạo chuỗi bên trong chuỗi khác không thiết lập bất kỳ mối quan hệ đặc biệt nào và toàn bộ điểm trong hầu hết các trường hợp là để cho một chuỗi hoạt động nhiều hơn hoặc chấm dứt trong khi chuỗi khác tiếp tục hoạt động. Trong kịch bản của bạn, sử dụng một chuỗi khác để thực hiện công việc theo yêu cầu, như bạn mong đợi, cho phép phản hồi được gửi ngay lập tức. Chủ đề được sử dụng để phân phối yêu cầu đó cũng sẽ có sẵn ngay lập tức cho một yêu cầu khác, bất kể chuỗi khác của bạn mất bao lâu. Điều này là khá nhiều cách làm công việc không đồng bộ trong một thùng chứa servlet theo yêu cầu.

Lưu ý: Nếu bạn đang ở trong một thùng chứa Java EE đầy đủ, chủ đề có thể được quản lý cho bạn theo cách khiến bạn không thể tự tạo ra. Trong trường hợp đó, bạn nên yêu cầu thùng chứa cho một sợi, nhưng các nguyên tắc chung là giống nhau.

+0

Đây không phải là cách bạn nên thực hiện công việc không đồng bộ trong vùng chứa, nó có thể đơn giản nhất nhưng không được khuyến nghị. http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee-container-is-discouraged/533847#533847 – Robin

+0

@Robin: Cuộc gọi tốt. Tôi đã thêm một thông báo trước về các vùng chứa JEE đầy đủ. Tôi thường nghĩ về các thùng chứa servlet đơn giản. –

+0

@Robin: Cảm ơn các bạn. Tôi không tự mình xử lý chu kỳ sống của luồng. Tôi dự định sử dụng Spring TaskExecutor abstraction.http: //static.springsource.org/spring/docs/2.0.x/reference/scheduling.html#scheduling-task-executor-usage Ứng dụng web của tôi đang hoạt động dưới tomcat 6. Spring cũng cung cấp việc triển khai trình quản lý công việc như được đề cập trong liên kết nhưng nó nói rằng đặc tả của nó không phải là JEE. Cái nào tốt hơn trong enviornment của tôi? – hellojava

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