2012-09-18 26 views
5

Đồng nghiệp của tôi nói rằng sử dụng EJB cục bộ không phải là ý tưởng hay, vì chúng hoạt động như các lớp được đóng gói bên trong JAR (tức là khi EJB chỉ sử dụng là local chúng không có lợi thế hơn các lớp bình thường). Và tôi phải sử dụng EJB chỉ khi một số đoạn mã có khả năng có thể được sử dụng bởi một số ứng dụng. Nhưng tôi đã đọc về nhiều ưu điểm của EJB (bảo mật, an toàn luồng, trasanctions vv). Vì vậy, tôi bối rối: khi nào sử dụng GWT Servlet (nó thuận tiện hơn so với đơn giản HTTPServlet, nó cung cấp lời gọi phương thức kiểu RPC) và khi nào sử dụng EJB?Khi thích EJB hơn GWT Servlet

P.S. Tôi không sử dụng bất kỳ tương lai nào như JPA 2.0, CDI, vv (vì tôi chỉ có thể sử dụng Java EE 5 trên WAS 7).

+0

[Điều này có thể hữu ích] (http://stackoverflow.com/questions/2013793/web-services-vs-ejb-vs-rmi-advantages-and-disadvantages). – betomontejo

Trả lời

9

Đồng nghiệp của tôi nói với tôi rằng sử dụng EJB địa phương không phải là ý tưởng tốt

tôi phản đối kịch liệt với điều đó. EJB địa phươngrất ý tưởng hay vì chúng là loại hạt hoàn hảo để triển khai logic nghiệp vụ của bạn. Vụ mùa hiện tại của đậu EJB có trọng lượng rất nhẹ nên bạn không phải tránh chúng vì bất kỳ trọng lượng nào được cho là nặng.

Lợi thế lớn nhất của các loại hạt này có lẽ là quản lý giao dịch tự động của chúng, sẽ được sử dụng rất nhiều khi thực hiện bất kỳ loại công việc cơ sở dữ liệu nào.

Nó không chỉ là về các ứng dụng doanh nghiệp cần truy cập vào hàng đợi JMS và các hệ thống EIS phức tạp. Bất kỳ ứng dụng web nào cũng thực hiện nhiều hơn một lần ghi vào cơ sở dữ liệu tại một thời điểm rất nhiều lợi ích từ việc này. Nếu không có giao dịch, bạn sẽ kết thúc bằng cách nói rằng User chỉ còn nửa chừng trong cơ sở dữ liệu bất cứ khi nào ngoại lệ hoặc sự cố xảy ra. Và nếu không có EJB, bạn sẽ phải xả mã của mình bằng các câu lệnh start\commit\rollback rất chi tiết, hãy để một mình truyền bá giao dịch của bạn (thường thông qua 'Kết nối') vào tất cả mã của bạn và có trường hợp riêng biệt khi giao dịch đang hoạt động hoặc không hoạt động .

Với hạt đậu EJB, tất cả sự phức tạp đó sẽ biến mất. Nó giống như bộ sưu tập rác và quản lý bộ nhớ thủ công.

Có rất nhiều tính năng thú vị khác mà ngay cả những ứng dụng web đơn giản nhất có thể sử dụng, như kiểm tra vai trò khai báo (@RolesAllowed), gộp nhóm đậu (để điều tiết thông lượng, trong số những thứ khác) và an toàn chỉ.

Trong Java EE 6, chúng trở nên dễ sử dụng hơn cho các ứng dụng web đơn giản, và ở đó chúng có thể xuất hiện ở mọi nơi trong một .war (không có .jar và ô riêng biệt .ear cần nữa).

Vì vậy, tôi bối rối: khi nào sử dụng GWT Servlet (thuận tiện hơn HTTPServlet đơn giản, nó cung cấp lời gọi phương thức kiểu RPC) và khi nào sử dụng EJB?

Bây giờ chúng ta đang nói về từ xa EJB. Trong trường hợp này câu trả lời là khác nhau.

Nếu khách hàng đang kết nối từ Internet, bạn hầu như không bao giờ sử dụng EJB từ xa. Có một số lượng lớn các cổng thường cần phải mở, bao gồm các cổng trên máy khách. Tương tự như vậy, nếu bạn có các máy khách không đồng nhất (.NET, C++, và thậm chí cả các máy khách Java đang chạy một phiên bản khác của AS mà EJB từ xa sử dụng), bạn thường sẽ không sử dụng các EJB từ xa. Quay lại đầu trang Cung cấp Phản hồi THÔNG TIN THÊM

Mặc dù về mặt lý thuyết hỗ trợ Corba (IIOP) và do đó cho phép các loại máy khách khác nhau, trong thực tế giao tiếp EJB từ xa chỉ hoạt động nếu cả máy khách và máy chủ đang chạy Java và ngoại trừ AS (Máy chủ ứng dụng) hoặc một trong số đó là một máy khách Java SE với các thư viện máy khách cho máy chủ từ xa (có thể là lớn).

Hơi khó xử lý đối với công nghệ truy cập từ xa, nhưng thông số EJB thậm chí không chỉ định cách thiết lập kết nối từ xa ngay từ đầu. Tiêu chuẩn thực tế là JNDI từ xa, nhưng vì đây không phải là đặc tả, JBoss ví dụ muốn ngừng hỗ trợ điều này trong JBoss AS 7.

Trong tất cả các trường hợp đó, bạn sẽ sử dụng công nghệ Web Service thay vì EJB từ xa. GWT Servlet có thể là một lựa chọn, nhưng không thực sự là một ví dụ kinh điển ở đây. Trừ khi bạn đã sử dụng GWT, tôi sẽ không khuyên bạn nên cài đặt nó chỉ cho kết nối web/rpc chung từ các máy khách tùy ý (không phải GWT).

Các giải pháp chung về Java là JAX-WS và JAX-RS, là triển khai thực hiện REST SOAP REST (cả hai có thể được kết hợp với EJB btw). Triển khai JAX-RS nổi tiếng là Jersey (example) và RestEasy. Trong Java EE 6 bạn không phải cài đặt bất cứ thứ gì cho chúng, vì chúng đã là một phần của nền tảng này. Đối với Java EE 5, bạn phải cài đặt riêng JAX-RS, nhưng JAX-WS đã có sẵn.

Mọi người thường thấy JAX-RS dễ dàng bắt đầu và cách tiếp cận hiện đại hơn, mặc dù JAX-WS có nhiều tính năng an toàn hơn (cũng chính là nơi phần lớn sự phức tạp của nó xuất phát).

Cuối cùng, khi làm chúng tôi sử dụng EJB từ xa? Thông thường, bạn sẽ làm điều này để liên lạc giữa các ứng dụng trên mạng cục bộ đang chạy AS giống nhau. Trong trường hợp đó, có lợi thế hiệu suất tiềm năng (serialization nhị phân có thể nhanh hơn so với chuyển đổi json/xml do đó và ra) và có một số tùy chọn mạnh mẽ để tuyên truyền một bối cảnh an ninh và điều phối một giao dịch phân tán. Các ứng dụng web đơn giản rất có thể sẽ không yêu cầu tính năng cuối cùng thường xuyên nếu có.

Mẫu thường thấy là của một tài nguyên JAX-RS (bean) chấp nhận yêu cầu từ khách hàng từ xa (web), và sau đó giao công việc cho một EJB cục bộ có chứa logic nghiệp vụ thực tế.

+0

Thông tin tuyệt vời ... – Jmoney38

0

Điều đó phụ thuộc vào phạm vi yêu cầu ứng dụng/dự án của bạn. EJB được sử dụng để hỗ trợ các tính năng Java EE. Nó không bao gồm trong phạm vi dự án của bạn. Không sử dụng nó. Java EE Features

+0

Ý của bạn là gì dưới các tính năng của Java EE? Tôi nghĩ rằng tôi có thể sử dụng JPA, REST, SOAP, CDI vv mà không cần sử dụng EJB. Vì vậy, khi sử dụng EJB? – MyTitle

+0

có, bạn có thể sử dụng chúng mà không cần sử dụng EJB. Tuy nhiên, bạn phải kiểm soát giao dịch theo cách thủ công (Bean Management Transaction). làm thế nào về mùa xuân? – CycDemo

+0

'làm thế nào về mùa xuân? 'Không phải trong công việc hiện tại) – MyTitle

1

EJB là công nghệ được sử dụng trong back-end trên vùng chứa của chính nó và cung cấp một số tính năng như giao dịch bảo mật, v.v ... minh bạch cho nhà phát triển.

từ hướng dẫn Java EE:

Bạn nên xem xét sử dụng enterprise bean nếu ứng dụng của bạn có bất kỳ của các yêu cầu sau:

Ứng dụng này phải được mở rộng. Để đáp ứng số lượng ngày càng tăng của người dùng, bạn có thể cần phải phân phối các thành phần của ứng dụng trên nhiều máy. Không chỉ những hạt đậu của một ứng dụng chạy trên các máy khác nhau, mà còn vị trí của chúng sẽ vẫn giữ nguyên là đối với khách hàng.

Giao dịch phải đảm bảo tính toàn vẹn của dữ liệu. Hạt doanh nghiệp hỗ trợ giao dịch , các cơ chế quản lý quyền truy cập đồng thời của các đối tượng được chia sẻ .

Ứng dụng này sẽ có nhiều khách hàng. Chỉ với một vài dòng mã, khách hàng từ xa có thể dễ dàng xác định vị trí các hạt doanh nghiệp. Những khách hàng này có thể mỏng, khác nhau và rất nhiều.

Bây giờ, khi bạn chỉ phát triển Web trong một máy chủ Web, EJB sẽ không thực sự giúp bạn và có các tùy chọn dễ dàng hơn khác như GWT Servlet chẳng hạn.

Tuy nhiên nếu bạn muốn sử dụng các giao dịch được quản lý, hãy kết nối với hàng đợi JMS hoặc thực hiện xử lý hàng loạt trong nền sau đó EJB sẽ phát.

Ví dụ: bạn có một đơn hàng và bạn cần liên lạc với các phòng ban khác nhau để hoàn thành đơn đặt hàng. Trong trường hợp này, bạn sẽ cần một quy trình nền sẽ thực hiện công việc trong khi giao diện người dùng thông báo cho khách hàng biết rằng đơn hàng đang được chuẩn bị. Servlet có thể gửi thứ tự đến một hàng đợi trong đó một bean điều khiển Message có thể lấy nó và thực hiện một số xử lý bằng cách gọi các EJB khác.

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