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
Trả lời
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?.
... ý 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. –
@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
@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? –
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.
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ý. –
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 –
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
có thể chỉ là không giữ cho client bị đóng băng (nếu thread tốn thời gian?) – BigMike
Vì vậy, người dùng không phải chờ servlet hoàn tất tải lên –
http: //www.adam- bien.com/roller/abien/entry/are_servlets_thread_safe_and –
- 1. Bắt đầu một chuỗi mới trong vòng lặp foreach
- 2. Bắt buộc một chuỗi email mới
- 3. Luồng người mới bắt đầu trong C#
- 4. Lấy chỉ mục bắt đầu một dòng mới trong Stringbuffer
- 5. Bắt đầu một dòng mới trong hộp văn bản wpf
- 6. Bắt đầu một chuỗi đã dừng?
- 7. Trình xử lý (postnable) có bắt đầu một chuỗi mới không?
- 8. Xóa nhiệm vụ và bắt đầu một hoạt động mới
- 9. Người mới bắt đầu Lucene tutorial
- 10. AlarmClock cho người mới bắt đầu - Android
- 11. TransactionTooLargeException khi bắt đầu Hoạt động mới
- 12. Làm thế nào để bắt đầu với Mono trong Linux cho người mới bắt đầu?
- 13. cách bản địa hóa các chuỗi nhãn trong ios cho người mới bắt đầu
- 14. Vòng lặp, người mới bắt đầu
- 15. Người mới bắt đầu Android: onDestroy
- 16. chuỗi kết hợp mysql bắt đầu chuỗi trong bảng
- 17. Subversion dành cho người mới bắt đầu
- 18. Người mới bắt đầu của Haskell
- 19. Người mới bắt đầu Làm K & R
- 20. BroadcastReceiver cách bắt đầu mục đích mới
- 21. lập trình viên haskell mới bắt đầu
- 22. C mới bắt đầu: string phân tích
- 23. Người mới bắt đầu: Mẫu nhà máy trong Java
- 24. câu hỏi của người mới bắt đầu về lập lịch java (Quartz)
- 25. Tạo một chuỗi với BẮT ĐẦU VỚI từ Truy vấn
- 26. jquery người mới bắt đầu - chức năng để bắt đầu theo thời gian
- 27. Django: bắt đầu quá trình trong chuỗi nền?
- 28. Cách kiểm tra xem chuỗi có bắt đầu bằng một chuỗi khác trong C không?
- 29. Kiểm tra xem chuỗi "bắt đầu bằng" một chuỗi khác trong ASP cổ điển?
- 30. Cách tìm chỉ mục chuỗi trong danh sách bắt đầu bằng một số chuỗi con?
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 đó? –
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
@BigMike Glassfish 3.1.1 – saplingPro