2012-04-26 45 views
5

Khi một yêu cầu đến một servlet xử lý việc tải lên các tệp, bạn nên bắt đầu một chuỗi mới trong servlet đó bằng cách sử dụng new Thread(r).start() sẽ xử lý một phần dữ liệu khác đi kèm với tệp đã tải lên. Tôi muốn điều này để xử lý cả hai công việc song song.bắt đầu một chuỗi mới trong servlet

+0

Tôi sẽ không khuyến khích nó, trừ khi bạn sử dụng nhóm tổng hợp. Ngoài ra, Servlet 3 bây giờ có cuộc gọi dịch vụ không đồng bộ, tại sao không khám phá điều đó? –

+0

bạn đang sử dụng máy chủ ứng dụng nào? nó có cung cấp một số loại hỗ trợ cho các tác vụ chạy thời gian dài không? – BigMike

+0

@BigMike Glassfish 3.1.1 – saplingPro

Trả lời

17

Nó không chỉ là một ý tưởng tồi, nhưng nó cũng sẽ không hoạt động. Đây là lý do: yêu cầu tải lên tệp của bạn cuối cùng sẽ đạt đến phương thức doPost(). Miễn là bạn đang ở trong phương pháp này, container giữ kết nối mở. Khi bạn trở về từ phương thức đó (và nếu bạn quyết định xử lý dữ liệu đến trong một chuỗi riêng biệt, doPost() sẽ kết thúc sớm) thùng chứa giả định bạn đã hoàn tất yêu cầu và sẽ đóng kết nối. Từ quan điểm của khách hàng, việc tải lên bị gián đoạn bởi máy chủ. Và vì tính chất không đồng bộ của chủ đề, sự gián đoạn sẽ xảy ra trong thời điểm ngẫu nhiên.

Tin tôi đi, một số người dùng đã trải nghiệm điều đó: HttpServletResponse seems to periodically send prematurely.

Hơn nữa, bạn nên bắt đầu chuỗi mới cho mỗi yêu cầu vì quy mô này kém (và thậm chí bị cấm bởi một số thông số kỹ thuật). Những gì bạn có thể làm là sử dụng yêu cầu không đồng bộ Servlet 3.0 và xử lý tải lên không đồng bộ, nhưng tốt nhất là sử dụng một số nhóm chủ đề. Xem thêm: Why create new thread with startAsync instead of doing work in servlet thread?.

+0

... ý tưởng tồi trừ khi bạn cần thực hiện một số tác vụ chuyên sâu về CPU. –

+0

@Tomasz Nurkiewicz ngay cả khi tôi giữ công việc của luồng mới bên trong phương thức 'doPost()' của servlet đó? – saplingPro

+0

@Tomasz Nurkiewicz sẽ không sao để gửi một yêu cầu mới đến một servlet khác từ phương thức chạy của luồng, bên trong phương thức đăng của servlet này? –

-5

Không có gì sai khi bắt đầu chuỗi mới trong Servlet (không giống EJB), vì vậy có, nó là ok.

CHỈNH SỬA: ý nghĩ thứ hai @Tomasz Nurkiewicz là đúng. Tải lên tệp sẽ bị dừng.

+0

Không đúng, việc viết một chuỗi trong một môi trường đồng thời cần được quản lý. –

+0

Miễn là luồng không sử dụng bất kỳ biến không phải cục bộ nào (các trường trong servlet) thì không có vấn đề gì. Tôi cho rằng mọi thứ xảy ra bên trong phương thức doGet/doPost –

-2

Servlets được chạy ngầm trong các luồng mới bởi máy chủ web, vì vậy bất cứ khi nào có yêu cầu nào truy cập vào một servlet, thì nó sẽ được thực hiện trong một luồng khác. Tôi không biết trước một lý do để tạo ra một chủ đề mới cho mình

+0

có thể chỉ là không giữ cho client bị đóng băng (nếu thread tốn thời gian?) – BigMike

+0

Vì vậy, người dùng không phải chờ servlet hoàn tất tải lên –

+0

http: //www.adam- bien.com/roller/abien/entry/are_servlets_thread_safe_and –

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