2011-01-03 35 views
6

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

4

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.

+1

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

+0

Đ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

+1

@Vapen no, xem câu trả lời của tôi. – jtahlborn

1

Để 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ủ.

9

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.

9

Đâ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.