EJB là gì và nó làm gì?


151

Đã cố gắng tìm hiểu EJBđậu là gì, điều đó có nghĩa là cá thể của chúng được quản lý trong một hồ bơi, blah blah. Thực sự không thể có được một nắm bắt tốt của họ.

Bạn có thể giải thích cho tôi những gì họ thực sự (thực tế cho một lập trình viên Java)? Họ làm gì? Mục đích của họ là gì? Tại sao thực sự sử dụng chúng? (Tại sao không chỉ dính vào POJO?) Có lẽ một ứng dụng ví dụ?

Vui lòng chỉ tham khảo thông tin cập nhật, đó là EJB 3.1. Thông tin ngày về EJB có thể gây hiểu nhầm.

Đối với người mới bắt đầu học EJB xin lưu ý:

EJB dựa trên các đối tượng phân tán , điều này đề cập đến các phần mềm chạy trên nhiều máy (ảo hoặc vật lý) được liên kết bởi một mạng .


Câu trả lời:


161

Tại sao thực sự sử dụng chúng? (Tại sao không chỉ dính vào POJO?)

NẾU bạn cần một thành phần truy cập cơ sở dữ liệu hoặc truy cập các tài nguyên thư mục / kết nối khác hoặc được truy cập từ nhiều máy khách hoặc được dự định là một dịch vụ SOA, EJB ngày nay thường "lớn hơn, mạnh hơn, nhanh hơn (hoặc ít nhất là có thể mở rộng hơn) và đơn giản hơn "so với POJO. Chúng có giá trị nhất để phục vụ số lượng lớn người dùng qua web hoặc mạng công ty và có phần ít giá trị hơn cho các ứng dụng nhỏ trong một bộ phận.

  1. Tái sử dụng / Chia sẻ Logic trên nhiều ứng dụng / máy khách với khớp nối lỏng lẻo.
    EJB có thể được đóng gói trong lọ riêng của họ, được triển khai và được gọi từ nhiều nơi. Chúng là những thành phần phổ biến. Đúng, POJO có thể (cẩn thận!) Được thiết kế dưới dạng thư viện và được đóng gói dưới dạng lọ. Nhưng EJB hỗ trợ cả truy cập mạng cục bộ và từ xa - bao gồm thông qua giao diện java cục bộ, RMI trong suốt, tin nhắn không đồng bộ JMS và dịch vụ web SOAP / REST, tiết kiệm từ các phụ thuộc jar cắt và dán với nhiều triển khai (không nhất quán?).
    Chúng rất hữu ích cho việc tạo các dịch vụ SOA. Khi được sử dụng để truy cập cục bộ, chúng là POJO (có thêm dịch vụ container miễn phí). Hành động thiết kế một lớp EJB riêng biệt thúc đẩy sự chăm sóc thêm để tối đa hóa việc đóng gói, khớp nối và gắn kết lỏng lẻo và thúc đẩy giao diện sạch (Mặt tiền), che chắn người gọi khỏi các mô hình xử lý và dữ liệu phức tạp.

  2. Khả năng mở rộng và độ tin cậy Nếu bạn áp dụng một số lượng lớn yêu cầu từ các tin nhắn / quy trình / chủ đề gọi khác nhau, chúng sẽ được phân phối trên các phiên bản EJB có sẵn trong nhóm trước rồi xếp hàng. Điều này có nghĩa là nếu số lượng yêu cầu đến mỗi giây lớn hơn máy chủ có thể xử lý, chúng tôi sẽ xuống cấp một cách duyên dáng - luôn có một số yêu cầu được xử lý hiệu quả và các yêu cầu vượt quá được thực hiện để chờ đợi. Chúng tôi không tiếp cận máy chủ "meltdown" - nơi TẤT CẢ các yêu cầu trải qua thời gian phản hồi khủng khiếp, cộng với máy chủ cố gắng truy cập nhiều tài nguyên hơn phần cứng & HĐH có thể xử lý và do đó gặp sự cố. Các EJB có thể được triển khai trên các tầng riêng biệt có thể được phân cụm - điều này mang lại độ tin cậy thông qua chuyển đổi dự phòng từ máy chủ này sang máy chủ khác, cộng với phần cứng có thể được thêm vào quy mô tuyến tính.

  3. Quản lý đồng thời. Container đảm bảo rằng các phiên bản EJB được tự động truy cập một cách an toàn (ser seri) bởi nhiều khách hàng. Container quản lý nhóm EJB, nhóm luồng, hàng đợi gọi và tự động thực hiện khóa ghi mức phương thức (mặc định) hoặc khóa đọc (thông qua @Lock (READ)). Điều này bảo vệ dữ liệu khỏi tham nhũng thông qua các xung đột ghi-ghi đồng thời và giúp dữ liệu được đọc một cách nhất quán bằng cách ngăn chặn các xung đột đọc-ghi.
    Điều này chủ yếu hữu ích cho các phiên của @Singleton, trong đó bean đang thao tác và chia sẻ trạng thái chung giữa các người gọi khách. Điều này có thể dễ dàng vượt qua để cấu hình thủ công hoặc điều khiển theo chương trình các kịch bản nâng cao để thực thi mã đồng thời và truy cập dữ liệu.

  4. Xử lý giao dịch tự động.
    Không làm gì cả và tất cả các phương thức EJB của bạn được chạy trong giao dịch JTA. Nếu bạn truy cập cơ sở dữ liệu bằng JPA hoặc JDBC, nó sẽ tự động được liệt kê trong giao dịch. Tương tự đối với các yêu cầu JMS và JCA. Chỉ định @TransactionAttribution (someTransactionMode) trước một phương thức để chỉ định nếu / cách phương thức cụ thể đó tham gia vào giao dịch JTA, ghi đè chế độ mặc định: "Bắt buộc".

  5. Truy cập tài nguyên / phụ thuộc rất đơn giản thông qua tiêm.
    Container sẽ tra cứu tài nguyên và đặt tham chiếu tài nguyên làm các trường đối tượng trong EJB: chẳng hạn như các kết nối JDBC được lưu trữ của JNDI, các kết nối / chủ đề / hàng đợi JMS, các EJB khác, Giao dịch JTA, bối cảnh tồn tại của trình quản lý thực thể JPA, các đơn vị tồn tại của trình quản lý thực thể JPA và Tài nguyên bộ chuyển đổi JCA. ví dụ: để thiết lập tham chiếu đến EJB khác và Giao dịch JTA & Trình quản lý thực thể JPA & nhà máy kết nối JMS và hàng đợi:

    @Stateless
    public class MyAccountsBean {
    
        @EJB SomeOtherBeanClass someOtherBean;
        @Resource UserTransaction jtaTx;
        @PersistenceContext(unitName="AccountsPU") EntityManager em;
        @Resource QueueConnectionFactory accountsJMSfactory;
        @Resource Queue accountPaymentDestinationQueue;
    
        public List<Account> processAccounts(DepartmentId id) {
            // Use all of above instance variables with no additional setup.
            // They automatically partake in a (server coordinated) JTA transaction
        }
    }
    

    Một Servlet có thể gọi bean này cục bộ, bằng cách khai báo một biến thể hiện:

    @EJB MyAccountsBean accountsBean;    
    

    và sau đó chỉ cần gọi các phương thức của nó như mong muốn.

  6. Tương tác thông minh với JPA. Theo mặc định, EntityManager được chèn như trên sử dụng bối cảnh tồn tại trong phạm vi giao dịch. Điều này là hoàn hảo cho đậu phiên phi trạng thái. Khi một phương thức EJB (không trạng thái) được gọi, bối cảnh tồn tại mới được tạo trong giao dịch mới, tất cả các thể hiện đối tượng thực thể được truy xuất / ghi vào DB chỉ hiển thị trong lệnh gọi phương thức đó và được cách ly với các phương thức khác. Nhưng nếu phương thức EJB không trạng thái khác được gọi theo phương thức, container sẽ truyền và chia sẻ cùng một PC cho chúng, do đó, các thực thể tương tự được chia sẻ tự động theo cách nhất quán thông qua PC trong cùng một giao dịch.
    Nếu một bean phiên @Stateful được khai báo, thì mối quan hệ thông minh tương đương với JPA sẽ đạt được bằng cách khai báo thực thể là một phạm vi mở rộng: @PersistentContent (unitName = "AccountPU, type = EXTENDED). Điều này tồn tại trong vòng đời của phiên bean, trên nhiều cuộc gọi và giao dịch bean, lưu trữ các bản sao trong bộ nhớ của các thực thể DB được truy xuất / ghi trước đó để chúng không cần phải truy xuất lại.

  7. Quản lý vòng đời. Vòng đời của EJB được quản lý container. Theo yêu cầu, nó tạo ra các phiên bản EJB, xóa và khởi tạo trạng thái bean phiên trạng thái, thụ động & kích hoạt và gọi các phương thức gọi lại vòng đời, do đó mã EJB có thể tham gia vào các hoạt động vòng đời để thu thập và giải phóng tài nguyên hoặc thực hiện hành vi khởi tạo và tắt máy khác. Nó cũng nắm bắt tất cả các ngoại lệ, ghi lại chúng, khôi phục các giao dịch theo yêu cầu và đưa ra các ngoại lệ EJB mới hoặc @ApplicationExceptions theo yêu cầu.

  8. Quản lý an ninh. Kiểm soát truy cập dựa trên vai trò đối với EJB có thể được định cấu hình thông qua cài đặt chú thích hoặc XML đơn giản. Máy chủ tự động chuyển các chi tiết người dùng được xác thực cùng với mỗi cuộc gọi dưới dạng bối cảnh bảo mật (hiệu trưởng và vai trò của cuộc gọi). Nó đảm bảo rằng tất cả các quy tắc RBAC được thực thi tự động để các phương thức không thể được gọi bất hợp pháp bởi vai trò sai. Nó cho phép EJB dễ dàng truy cập chi tiết người dùng / vai trò để kiểm tra thêm theo chương trình. Nó cho phép cắm thêm xử lý bảo mật (hoặc thậm chí các công cụ IAM) vào thùng chứa theo cách tiêu chuẩn.

  9. Tiêu chuẩn hóa và tính di động. Việc triển khai EJB tuân thủ các tiêu chuẩn Java EE và các quy ước mã hóa, thúc đẩy chất lượng và dễ hiểu và bảo trì. Nó cũng thúc đẩy tính di động của mã cho các máy chủ ứng dụng của nhà cung cấp mới, bằng cách đảm bảo tất cả chúng đều hỗ trợ các tính năng và hành vi tiêu chuẩn giống nhau và không khuyến khích các nhà phát triển vô tình áp dụng các
    tính năng của nhà cung cấp không di động độc quyền .

  10. The Kicker thực sự: Đơn giản. Tất cả những điều trên có thể được thực hiện với mã được sắp xếp hợp lý - bằng cách sử dụng các cài đặt mặc định cho EJB trong Java EE 6 hoặc thêm một vài chú thích. Mã hóa doanh nghiệp / tính năng sức mạnh công nghiệp trong các POJO riêng của bạn sẽ là cách nhiều volumous, phức tạp và dễ bị lỗi. Khi bạn bắt đầu mã hóa bằng EJB, chúng khá dễ phát triển và mang lại một bộ lợi ích "đi xe miễn phí" tuyệt vời.

Trong thông số EJB ban đầu của 10 năm trước, EJB là một rắc rối lớn về năng suất. Chúng đã cồng kềnh, cần rất nhiều mã và cấu tạo cấu hình và cung cấp khoảng 2/3 lợi ích ở trên. Hầu hết các dự án web đã không thực sự sử dụng chúng. Nhưng điều này đã thay đổi đáng kể với 10 năm điều chỉnh, đại tu, tăng cường chức năng và phát triển dòng phát triển. Trong Java EE 6, chúng cung cấp mức độ công nghiệp tối đa và đơn giản sử dụng.

Có gì không thích ?? :-) :-)


67

EJB là một thành phần Java, chứa logic nghiệp vụ, mà bạn triển khai trong một thùng chứa và được hưởng lợi từ các dịch vụ kỹ thuật do container cung cấp, thường là theo cách khai báo, nhờ các chú thích:

  • quản lý giao dịch: một giao dịch có thể được bắt đầu tự động trước khi một phương thức của EJB được gọi và được cam kết hoặc phục hồi khi phương thức này trở lại. Bối cảnh giao dịch này được truyền đến các cuộc gọi đến các EJB khác.
  • quản lý bảo mật: một kiểm tra có thể được thực hiện rằng người gọi có các vai trò cần thiết để thực hiện phương thức.
  • tiêm phụ thuộc: các EJB khác hoặc các tài nguyên như trình quản lý thực thể JPA, nguồn dữ liệu JDBC, v.v. có thể được đưa vào EJB.
  • đồng thời: bộ chứa đảm bảo rằng chỉ có một luồng tại một thời điểm gọi một phương thức của thể hiện EJB của bạn.
  • phân phối: một số EJB có thể được gọi từ xa, từ một JVM khác.
  • chuyển đổi dự phòng và cân bằng tải: các máy khách từ xa của EJB của bạn có thể tự động chuyển hướng cuộc gọi của chúng đến một máy chủ khác nếu cần.
  • quản lý tài nguyên: các bean có trạng thái có thể tự động được chuyển sang đĩa để hạn chế mức tiêu thụ bộ nhớ của máy chủ của bạn.
  • ... Có lẽ tôi đã quên một số điểm.

Khi bạn đề cập đến giao dịch - bạn đề cập đến sự kiên trì?
jacktrades

6
Có, nhưng không chỉ. Các container EJB cung cấp trình quản lý giao dịch JTA phân tán, hỗ trợ nhiều tài nguyên trong một giao dịch. Ví dụ, bạn có thể cập nhật một số dữ liệu trong cơ sở dữ liệu và gửi một số tin nhắn JMS, trong một giao dịch. Nếu bất cứ điều gì thất bại, mọi thứ sẽ được khôi phục: DB cập nhật và tin nhắn đã gửi.
JB Nizet

@JBNizet xin lỗi vì đã bình luận về một chủ đề cũ, nhưng KHÔNG phải các khung EJB như Spring đang cung cấp các dịch vụ mà bạn đã đề cập. tôi không hiểu sự khác biệt
MoienGK

Các nguyên tắc cơ bản là như nhau. Spring lấy ý tưởng từ EJB và ngược lại. Nhưng API, cách triển khai, cách triển khai và một số tính năng khác nhau.
JB Nizet

@JB Nizet Trong mô hình MVC, bạn sẽ đặt EJB ở đâu nói chung? Tôi muốn nói rằng chúng thuộc về lớp Model, mặc dù tôi biết nhiều người nói rằng chúng là bộ điều khiển. Nếu EJB chứa logic nghiệp vụ (bạn nói họ làm như vậy), thì theo định nghĩa, chúng là lớp mô hình.
dùng107986

22

Hy vọng điều này từ tài liệu của Oracle sẽ giúp một người như tôi hiểu được chủ đề của EJB một cách đơn giản.

Bean doanh nghiệp là gì? Được viết bằng ngôn ngữ lập trình Java, một bean doanh nghiệp là một thành phần phía máy chủ đóng gói logic nghiệp vụ của một ứng dụng. Logic nghiệp vụ là mã đáp ứng mục đích của ứng dụng. Ví dụ, trong một ứng dụng kiểm soát hàng tồn kho, các hạt doanh nghiệp có thể triển khai logic nghiệp vụ trong các phương thức được gọi là checkInventoryLevel và order sản phẩm. Bằng cách gọi các phương thức này, khách hàng có thể truy cập các dịch vụ kiểm kê do ứng dụng cung cấp.

Lợi ích của Đậu doanh nghiệp Vì nhiều lý do, đậu doanh nghiệp đơn giản hóa việc phát triển các ứng dụng phân tán lớn. Đầu tiên, vì bộ chứa EJB cung cấp dịch vụ cấp hệ thống cho các bean doanh nghiệp, nhà phát triển bean có thể tập trung giải quyết các vấn đề kinh doanh. Container EJB, chứ không phải là nhà phát triển bean, chịu trách nhiệm cho các dịch vụ cấp hệ thống như quản lý giao dịch và ủy quyền bảo mật.

Thứ hai, vì các bean chứ không phải các máy khách chứa logic nghiệp vụ của ứng dụng, nhà phát triển ứng dụng khách có thể tập trung vào việc trình bày ứng dụng khách. Nhà phát triển ứng dụng khách không phải mã hóa các thói quen thực hiện quy tắc kinh doanh hoặc truy cập cơ sở dữ liệu. Do đó, các máy khách mỏng hơn, một lợi ích đặc biệt quan trọng đối với các máy khách chạy trên các thiết bị nhỏ.

Thứ ba, vì các bean doanh nghiệp là các thành phần di động, trình biên dịch ứng dụng có thể xây dựng các ứng dụng mới từ các bean hiện có. Các ứng dụng này có thể chạy trên mọi máy chủ Java EE tuân thủ miễn là chúng sử dụng các API tiêu chuẩn.

Khi nào nên sử dụng Đậu doanh nghiệp Bạn nên cân nhắc sử dụng đậu doanh nghiệp nếu ứng dụng của bạn có bất kỳ yêu cầu nào sau đây:

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

Giao dịch phải đảm bảo tính toàn vẹn dữ liệu. Đậu doanh nghiệp hỗ trợ các giao dịch, các cơ chế quản lý 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ã, các máy khách từ xa có thể dễ dàng xác định vị trí của các doanh nghiệp. Những khách hàng này có thể mỏng, đa dạng và nhiều.


3

Câu hỏi khiến tôi quan tâm nhất là tôi có thể sử dụng chúng như thế nào và ở đâu. Để hiểu điều này, trước tiên chúng ta cần xem loại EJB nào tồn tại. Có 2 loại lớn:

  1. Đậu phiên
  2. Đậu điều khiển thông điệp

Hãy xem xét Đậu phiên. Chúng có 3 loại:

  1. Stateful - các thành phần này duy trì trạng thái và dành riêng cho một khách hàng qua nhiều yêu cầu. Xem nó như một phiên. Việc sử dụng ngay lập tức có thể được đưa vào là giỏ hàng hoặc loại phiên khác (phiên đăng nhập, v.v.)
  2. Không trạng thái - đây là những thành phần độc lập không duy trì thông tin giữa các yêu cầu, nhưng chúng là duy nhất cho người dùng. Sử dụng ngay lập tức xuất hiện trong tâm trí - Các lớp dịch vụ trong lớp dịch vụ . Hãy tưởng tượng OrderService. Một ứng dụng lớn khác cho những điều này là để lộ các dịch vụ web. Một lần nữa, đây là trong lớp Dịch vụ hoặc hoàn toàn riêng biệt.
  3. Singleton - đây là những hạt tồn tại trên mỗi ứng dụng và được tạo một lần và có thể được sử dụng lại / truy cập nhiều lần. Ngay lập tức Configurationthành phần xuất hiện trong tâm trí - nơi bạn có thể lưu trữ cấu hình cấp ứng dụng và truy cập chúng khi bạn cần chúng từ bất cứ đâu.

Bây giờ phần còn lại của các khả năng hoặc tính năng có thể được sử dụng trên các lớp trong bất kỳ tình huống nào như vậy:

  • Bảo vệ - bạn có thể kiểm tra các quyền với chú thích về phương thức được gọi. Điều này có thể xảy ra trong lớp Dịch vụ cũng như trong Trình điều khiển nếu bạn muốn như vậy.
  • Quản lý giao dịch - đây là ứng cử viên rõ ràng trong lớp Dịch vụ hoặc lớp Kiên trì
  • Dependency Injection - một lần nữa sẽ được sử dụng ở mọi nơi

Một ứng dụng lớn trong thời hiện đại là cái gọi là Kiến trúc dịch vụ và hướng dịch vụ. Bạn có thể đóng gói một số thành phần logic nghiệp vụ dưới dạng EJB và phân phối chúng trên toàn tổ chức, được sử dụng bởi nhiều khách hàng (bởi khách hàng ở đây tôi có nghĩa là các ứng dụng phụ trợ khác).

Và như thế. Bây giờ nhược điểm lớn là bạn trở nên rất phụ thuộc vào bộ chứa EJB và mặc dù bạn có thể chuyển đổi giữa 2 triển khai tham chiếu, bạn sẽ không thể chuyển sang thứ gì đó nhẹ hơn - ví dụ như Tomcat. Nhưng tại sao bạn lại muốn hy sinh tất cả những lợi ích?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.