Từ những gì tôi hiểu nó là bất hợp pháp để sinh ra các chủ đề từ bên trong một EJB vì nó có khả năng gây trở ngại cho vòng đời của EJB. Tuy nhiên, nó là bất hợp pháp để sử dụng các lớp Java được xác định trước từ JDK mà nội bộ sinh ra và xử lý các chủ đề như Executor trong một EJB, cụ thể là một MDB?EJB's and Threading
Trả lời
Vấn đề lớn nhất với chủ đề và EJB là chủ đề là tài nguyên giới hạn được sử dụng nhiều bởi vùng chứa và lỗi của luồng dẫn đến rò rỉ nhóm luồng có thể tiêu diệt toàn bộ cá thể JVM.
Executor nên được xử lý tốt hơn, nhưng nó vẫn sẽ sử dụng hết chuỗi trong một khoảng thời gian; nó cũng có thể không thành công ngay lập tức nếu ai đó đã điều chỉnh vùng chứa để sử dụng hết các chuỗi có sẵn.
Tóm tắt là bạn sẽ đi bộ đường dài.
Để thêm vào câu trả lời của @Charlie Martin, bất cứ điều gì bạn cần Người thực thi làm, bạn có thể thiết kế một EJB khác để thực hiện hành động tương tự mà không có Người thi hành. Điều này cho phép EJB mới chạy trong một luồng riêng được xử lý bởi vùng chứa. Nhược điểm là bạn có thể phải "reimplement the wheel" vì bạn vẫn không muốn sử dụng threads/Executor từ JVM. Nó cũng làm tăng thêm chi phí cho việc lấy một EJB để định vị/yêu cầu/kết nối/gọi một thiết bị khác.
Điểm mấu chốt là EJB được coi là chủ đề công nhân. Nó có vẻ như quá mức cần thiết để tái tạo mã thay vì sử dụng Executor và nó lên đến một điểm. Sự khác biệt lớn nhất là một trong những quy mô. Các nhà điều hành sẽ bị giới hạn trong một JVM duy nhất trong khi các EJB có thể được thu nhỏ trên các JVM và trên các máy chủ.
Bạn "không thể" (không nên) sử dụng chủ đề, hồ bơi chuỗi, người thi hành ... tất cả các điều trên. điểm của việc sử dụng một máy chủ ứng dụng là chỉ viết logic nghiệp vụ và để cho máy chủ ứng dụng thực hiện việc nâng hạng nặng. nếu bạn thực sự, thực sự cần phải làm luồng của riêng bạn, sử dụng một dịch vụ EJB 3.1 "singleton" để quản lý luồng. Tuy nhiên, như đã đề cập bởi những người khác, tốt nhất nên để điều này cho máy chủ ứng dụng. một cách để xử lý song song trong máy chủ ứng dụng là sử dụng MDB (có vẻ như bạn đang sử dụng), mặc dù tùy thuộc vào loại xử lý song song, chúng có thể quá nặng.
Đây là những gì EJB 3.1 @Asynchronous
là dành cho và chắc chắn nên được sử dụng thay vì một Executor. Nó thường rất nguy hiểm để cạnh tranh với các hồ chứa của container. Làm như vậy là một cách tuyệt vời để giết hiệu suất.
Hỗ trợ Asynchronous
sẽ sử dụng các hồ chứa luồng của thùng chứa và được an toàn hơn nhiều. Xem this answer để biết chi tiết về cách hoạt động của Asynchronous
.
- 1. Quan sátCollection and threading
- 2. Multi-Threading HttpClient
- 3. Threading Box2D với pthreads
- 4. Threading Python và GIL
- 5. Java's Swing Threading
- 6. INotifyPropertyChanged và Threading
- 7. Perl Queues và Threading
- 8. Threading đơn giản trong C#
- 9. Mở rộng thông tin người dùng trên nhiều EJBs
- 10. Tại sao chủ đề EJBs an toàn và servlet không?
- 11. Multi-threading với Net HttpListener
- 12. C# Threading CPU của Parked?
- 13. Delphi Multi-Threading Message Loop
- 14. Câu hỏi khái niệm về Python Threading
- 15. Tại sao mẫu MSDN từ Threading Tutorial bị lỗi?
- 16. .NET Threading Model và Application.DoEvents vs. Thread.Sleep
- 17. Threading nhiều cuộc gọi không đồng bộ
- 18. Threading Python bất ngờ chậm hơn
- 19. Threading và tĩnh phương pháp trong C#
- 20. Java Generics and numbers
- 21. NSDirectoryEnumerator And Subfolders
- 22. MySQL AND Filemaker Pro?
- 23. Generics and System.Collections
- 24. C++ typedefs and enums
- 25. FindFirstFile and Junctions
- 26. Grails and Subdomains
- 27. Drools and Maps
- 28. Thread.IsAlive and Thread.ThreadState == ThreadState.Running
- 29. contenteditable and emberjs
- 30. XML Diff and Merge
Tôi đồng ý với charlie, chỉ nghĩ rằng tôi muốn phát triển và nói rằng MDB gần như chắc chắn sẽ là giải pháp tốt hơn. – vickirk
Điều đó có nghĩa là tôi có thể sử dụng Executor trong một MDB mà không có bất kỳ rủi ro nào không? – TheWolf
@Vapen no, xem câu trả lời của tôi. – jtahlborn