Co to jest EJB i do czego służy?

151

Próbowałem się dowiedzieć, czym EJBsą fasole, co to znaczy, że ich instancje są zarządzane w basenie, bla, bla. Naprawdę nie mogę ich dobrze uchwycić.

Czy możesz mi wyjaśnić, czym one naprawdę są (praktycznie dla programisty Java)? Co oni robią? Jakie są ich cele? Po co ich naprawdę używać? (Dlaczego po prostu nie trzymać się POJO?) Może przykładowa aplikacja?

Proszę odnieść się tylko do zaktualizowanych informacji, to znaczy EJB 3.1. Nieaktualne informacje o EJB mogą wprowadzać w błąd.

Dla początkujących uczących się EJB uwaga:

EJB są oparte na obiektach rozproszonych , dotyczy to elementów oprogramowania działających na wielu maszynach (wirtualnych lub fizycznych) połączonych siecią .

jacktrades
źródło

Odpowiedzi:

161

Po co ich naprawdę używać? (Dlaczego po prostu nie trzymać się POJO?)

JEŚLI potrzebujesz komponentu, który uzyskuje dostęp do bazy danych lub uzyskuje dostęp do innych zasobów łączności / katalogu, lub jest dostępny z wielu klientów lub jest przeznaczony jako usługa SOA, dzisiejsze EJB są zwykle „większe, silniejsze, szybsze (lub przynajmniej bardziej skalowalne) i prostsze ”niż POJO. Są najbardziej wartościowe w przypadku obsługi dużej liczby użytkowników w sieci WWW lub sieci firmowej, a nieco mniej w przypadku małych aplikacji w ramach działu.

  1. Ponowne użycie / udostępnianie logiki w wielu aplikacjach / klientach z luźnym sprzężeniem.
    EJB można pakować do własnych słoików, wdrażać i wywoływać z wielu miejsc. Są to elementy wspólne. To prawda, POJO można (ostrożnie!) Projektować jako biblioteki i pakować jako słoiki. Ale EJB obsługują zarówno lokalny, jak i zdalny dostęp do sieci - w tym za pośrednictwem lokalnego interfejsu Java, przezroczystego RMI, wiadomości asynchronicznej JMS i usługi sieciowej SOAP / REST, oszczędzając przed zależnościami typu „wytnij i wklej” w wielu (niespójnych?) Wdrożeniach.
    Są bardzo przydatne do tworzenia usług SOA. W przypadku dostępu lokalnego są to POJO (z dodanymi bezpłatnymi usługami kontenerowymi). Czynność projektowania oddzielnej warstwy EJB promuje szczególną dbałość o maksymalizację enkapsulacji, luźnego sprzężenia i spójności oraz promuje czysty interfejs (Fasada), chroniąc dzwoniących przed złożonymi modelami przetwarzania i danych.

  2. Skalowalność i niezawodność W przypadku zastosowania ogromnej liczby żądań z różnych wywołujących komunikatów / procesów / wątków są one najpierw dystrybuowane do dostępnych instancji EJB w puli, a następnie umieszczane w kolejce. Oznacza to, że jeśli liczba żądań przychodzących na sekundę jest większa niż serwer może obsłużyć, postępujemy z wdziękiem - zawsze niektóre żądania są przetwarzane efektywnie, a nadmiarowe żądania czekają. Nie osiągamy „topnienia” serwera - gdzie WSZYSTKIE żądania jednocześnie doświadczają okropnego czasu odpowiedzi, a serwer próbuje uzyskać dostęp do większej liczby zasobów, niż jest w stanie obsłużyć sprzęt i system operacyjny, co powoduje awarie. EJB można wdrożyć na oddzielnej warstwie, którą można łączyć w klastry - zapewnia to niezawodność dzięki możliwości przełączania awaryjnego z jednego serwera na drugi, a ponadto można dodać sprzęt w celu skalowania liniowego.

  3. Zarządzanie współbieżnością. Kontener zapewnia, że ​​instancje EJB są automatycznie bezpiecznie (szeregowo) dostępne dla wielu klientów. Kontener zarządza pulą EJB, pulą wątków, kolejką wywołań i automatycznie wykonuje blokowanie zapisu na poziomie metody (domyślne) lub blokowanie odczytu (za pośrednictwem @Lock (READ)). Chroni to dane przed uszkodzeniem w wyniku współbieżnych kolizji zapisu i zapisu oraz ułatwia spójne odczytywanie danych, zapobiegając konfliktom odczytu i zapisu.
    Jest to przydatne głównie w przypadku komponentów bean sesji @Singleton, w których komponent bean manipuluje i udostępnia wspólny stan między wywołującymi klientami. Można to łatwo ominąć, aby ręcznie skonfigurować lub programowo kontrolować zaawansowane scenariusze dla współbieżnego wykonywania kodu i dostępu do danych.

  4. Zautomatyzowana obsługa transakcji.
    Nie rób nic, a wszystkie Twoje metody EJB są uruchamiane w transakcji JTA. Jeśli uzyskujesz dostęp do bazy danych za pomocą JPA lub JDBC, jest ona automatycznie rejestrowana w transakcji. To samo dotyczy wywołań JMS i JCA. Podaj @TransactionAttribute (someTransactionMode) przed metodą, aby określić, czy / w jaki sposób ta konkretna metoda uczestniczy w transakcji JTA, nadpisując tryb domyślny: „Wymagane”.

  5. Bardzo prosty dostęp do zasobów / zależności poprzez wstrzyknięcie.
    Kontener wyszuka zasoby i ustawi odniesienia do zasobów jako pola instancji w EJB: takie jak zapisane połączenia JDBC JNDI, połączenia / tematy / kolejki JMS, inne EJB, transakcje JTA, konteksty trwałości menedżera encji JPA, jednostki trwałości fabryki menedżera encji JPA oraz Zasoby adaptera JCA. np. aby ustawić odniesienie do innego EJB i transakcji JTA oraz menedżera encji JPA i fabryki połączeń JMS i kolejki:

    @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
        }
    }
    

    Serwlet może wywołać ten bean lokalnie, po prostu deklarując zmienną instancji:

    @EJB MyAccountsBean accountsBean;    
    

    a następnie po prostu wywołując jego metody zgodnie z potrzebami.

  6. Inteligentna interakcja z WZP. Domyślnie EntityManager wstrzyknięty jak powyżej używa kontekstu trwałości o zasięgu transakcji. Jest to idealne rozwiązanie dla fasoli sesji bezstanowych. Gdy wywoływana jest (bezstanowa) metoda EJB, w ramach nowej transakcji tworzony jest nowy kontekst trwałości, wszystkie instancje obiektu jednostki pobrane / zapisane w bazie danych są widoczne tylko w ramach tego wywołania metody i są odizolowane od innych metod. Ale jeśli inne bezstanowe EJB są wywoływane tą metodą, kontener propaguje się i udostępnia im ten sam komputer, więc te same jednostki są automatycznie udostępniane w spójny sposób przez komputer w tej samej transakcji.
    Jeśli zadeklarowano komponent bean sesji @Stateful, równe inteligentne podobieństwo z JPA jest osiągane przez zadeklarowanie elementu entityManager jako elementu o rozszerzonym zakresie: @PersistentContent (unitName = "AccountsPU, type = EXTENDED). To istnieje przez cały czas trwania sesji fasoli, w wielu wywołaniach i transakcjach bean, buforowanie w pamięci kopii jednostek bazy danych, które zostały wcześniej pobrane / zapisane, aby nie trzeba było ich ponownie odzyskiwać.

  7. Zarządzanie cyklem życia. Cykl życia EJB jest zarządzany przez kontener. W razie potrzeby tworzy instancje EJB, czyści i inicjuje stan komponentu bean sesji, pasywuje i aktywuje oraz wywołuje metody wywołania zwrotnego cyklu życia, dzięki czemu kod EJB może uczestniczyć w operacjach cyklu życia w celu pozyskiwania i zwalniania zasobów lub wykonywania innych czynności inicjowania i zamykania. Przechwytuje również wszystkie wyjątki, rejestruje je, wycofuje transakcje zgodnie z wymaganiami i w razie potrzeby zgłasza nowe wyjątki EJB lub @ApplicationExceptions.

  8. Zarządzanie bezpieczeństwem. Oparta na rolach kontrola dostępu do EJB może zostać skonfigurowana za pomocą prostej adnotacji lub ustawienia XML. Serwer automatycznie przekazuje szczegóły uwierzytelnionego użytkownika wraz z każdym wywołaniem jako kontekst zabezpieczeń (nazwa główna i rola wywołującego). Zapewnia to, że wszystkie reguły RBAC są automatycznie egzekwowane, aby metody nie mogły być nielegalnie wywoływane przez niewłaściwą rolę. Umożliwia EJB łatwy dostęp do szczegółów użytkownika / roli w celu dodatkowego automatycznego sprawdzania. Umożliwia podłączenie dodatkowego przetwarzania bezpieczeństwa (lub nawet narzędzi IAM) do kontenera w standardowy sposób.

  9. Standaryzacja i przenośność. Implementacje EJB są zgodne ze standardami Java EE i konwencjami kodowania, co zapewnia jakość oraz łatwość zrozumienia i utrzymania. Promuje również przenośność kodu na serwery aplikacji nowych dostawców, zapewniając, że wszystkie obsługują te same standardowe funkcje i zachowania, a także zniechęcając programistów do przypadkowego przyjmowania zastrzeżonych,
    nieprzenośnych funkcji dostawców.

  10. The Real Kicker: Prostota. Wszystko to można zrobić za pomocą bardzo uproszczonego kodu - albo przy użyciu domyślnych ustawień EJB w Java EE 6, albo dodając kilka adnotacji. Kodowanie cech korporacyjnych / przemysłowych we własnych POJO byłoby znacznie bardziej obszerne, złożone i podatne na błędy. Gdy zaczniesz programować za pomocą EJB, są one raczej łatwe do opracowania i dają wspaniały zestaw korzyści związanych z „darmową jazdą”.

W oryginalnej specyfikacji EJB sprzed 10 lat EJB stanowiły poważny problem z produktywnością. Były rozdęte, wymagały mnóstwa kodu i artefaktów konfiguracyjnych oraz zapewniały około 2/3 powyższych korzyści. Większość projektów internetowych w rzeczywistości ich nie wykorzystywała. Ale to się znacznie zmieniło po 10 latach ulepszania, przeglądów, ulepszania funkcjonalnego i usprawniania rozwoju. W Java EE 6 zapewniają maksymalny poziom wytrzymałości przemysłowej i prostotę użytkowania.

Czego nie lubić ?? :-) :-)

Glen Best
źródło
67

EJB to komponent Java, zawierający logikę biznesową, który wdrażasz w kontenerze i który korzysta z usług technicznych świadczonych przez kontener, zwykle w sposób deklaratywny, dzięki adnotacjom:

  • zarządzanie transakcjami: transakcja może zostać uruchomiona automatycznie przed wywołaniem metody EJB i zatwierdzona lub wycofana po powrocie tej metody. Ten kontekst transakcyjny jest propagowany do wywołań innych EJB.
  • zarządzanie bezpieczeństwem: można sprawdzić, czy dzwoniący ma niezbędne role do wykonania metody.
  • wstrzykiwanie zależności: inne EJB lub zasoby, takie jak menedżer encji JPA, źródło danych JDBC itp. mogą być wstrzykiwane do EJB.
  • współbieżność: kontener zapewnia, że ​​tylko jeden wątek na raz wywołuje metodę Twojej instancji EJB.
  • dystrybucja: niektóre komponenty EJB można wywołać zdalnie z innej maszyny JVM.
  • przełączanie awaryjne i równoważenie obciążenia: zdalni klienci EJB mogą w razie potrzeby automatycznie przekierowywać swoje wywołania na inny serwer.
  • zarządzanie zasobami: fasola stanowa może być automatycznie pasywowana na dysk w celu ograniczenia wykorzystania pamięci serwera.
  • ... Pewnie zapomniałem o niektórych punktach.
JB Nizet
źródło
Mówiąc o transakcji - mówisz o wytrwałości?
jacktrades
6
Tak, ale nie tylko. Kontenery EJB zapewniają rozproszonego menedżera transakcji JTA, obsługującego wiele zasobów w jednej transakcji. Możesz na przykład zaktualizować niektóre dane w bazie danych i wysłać niektóre komunikaty JMS w ramach jednej transakcji. Jeśli coś się nie powiedzie, wszystko zostanie wycofane: aktualizacje bazy danych i wysłane wiadomości.
JB Nizet
@JBNizet, przepraszam za komentowanie starego wątku, ale NIE frameworki EJB, takie jak Spring, zapewniają te usługi, o których wspomniałeś. nie rozumiem różnicy
MoienGK
Podstawowe zasady są takie same. Wiosna wzięła pomysły od EJB i vice versa. Ale interfejs API, implementacja, sposób wdrażania i niektóre funkcje są różne.
JB Nizet
@JB Nizet Gdzie we wzorcu MVC umieściłbyś ogólnie EJB? Powiedziałbym, że należą do warstwy Model, chociaż znam wielu ludzi, którzy mówią, że są kontrolerami. Jeśli EJB zawiera logikę biznesową (powiedziałeś, że tak), to z definicji jest warstwą modelu.
user107986
22

Mam nadzieję, że to z dokumentu Oracle pomoże komuś takiemu jak ja zrozumieć temat EJB w prosty sposób.

Co to jest fasola Enterprise? Komponent bean przedsiębiorstwa, napisany w języku programowania Java, jest komponentem po stronie serwera, który hermetyzuje logikę biznesową aplikacji. Logika biznesowa to kod, który spełnia cel aplikacji. Na przykład w aplikacji do kontroli zapasów komponenty bean korporacyjnych mogą implementować logikę biznesową w metodach o nazwie checkInventoryLevel i orderProduct. Wywołując te metody, klienci mogą uzyskać dostęp do usług inwentaryzacji udostępnianych przez aplikację.

Korzyści z Enterprise Beans Z kilku powodów, korporacyjne fasole upraszczają tworzenie dużych, rozproszonych aplikacji. Po pierwsze, ponieważ kontener EJB zapewnia usługi na poziomie systemu dla korporacyjnych komponentów bean, programista może skoncentrować się na rozwiązywaniu problemów biznesowych. Kontener EJB, a nie programista fasoli, jest odpowiedzialny za usługi na poziomie systemu, takie jak zarządzanie transakcjami i autoryzacja zabezpieczeń.

Po drugie, ponieważ ziarna zamiast klientów zawierają logikę biznesową aplikacji, programista klienta może skupić się na prezentacji klienta. Deweloper klienta nie musi kodować procedur implementujących reguły biznesowe lub uzyskiwać dostęp do baz danych. W rezultacie klienci są szczuplejsi, co jest szczególnie ważne w przypadku klientów działających na małych urządzeniach.

Po trzecie, ponieważ komponenty bean dla przedsiębiorstw są komponentami przenośnymi, asembler aplikacji może tworzyć nowe aplikacje z istniejących komponentów bean. Te aplikacje mogą działać na dowolnym zgodnym serwerze Java EE, pod warunkiem, że używają standardowych interfejsów API.

Kiedy używać komponentu bean Enterprise Należy rozważyć użycie komponentu bean Enterprise, jeśli aplikacja spełnia którekolwiek z następujących wymagań:

Aplikacja musi być skalowalna. Aby obsłużyć rosnącą liczbę użytkowników, może być konieczne rozpowszechnienie składników aplikacji na wielu komputerach. Nie tylko korporacyjne komponenty bean aplikacji mogą działać na różnych komputerach, ale także ich lokalizacja pozostanie niezauważalna dla klientów.

Transakcje muszą zapewniać integralność danych. Fasola korporacyjna obsługuje transakcje, mechanizmy zarządzające równoczesnym dostępem do współdzielonych obiektów.

Aplikacja będzie miała wielu klientów. Dzięki zaledwie kilku wierszom kodu klienci zdalni mogą łatwo zlokalizować komponenty bean korporacyjnych. Tacy klienci mogą być szczupli, różnorodni i liczni.

Tesfa Zelalem
źródło
3

Najbardziej interesuje mnie pytanie, jak i gdzie mogę ich używać. Aby to zrozumieć, musimy najpierw sprawdzić, jakie typy EJB istnieją. Istnieją 2 duże kategorie:

  1. Fasola sesyjna
  2. Fasola sterowana wiadomościami

Rozważmy fasolki sesji. Są 3 rodzaje:

  1. Stanowe - te składniki zachowują stan i są specyficzne dla klienta w wielu żądaniach. Zobacz to jako sesję. Bezpośrednie użycie, do którego można je wykorzystać, to wózki sklepowe lub innego rodzaju sesje (sesja logowania itp.)
  2. Bezstanowe - są to niezależne komponenty, które nie utrwalają informacji między żądaniami, ale są unikalne dla użytkownika. Natychmiastowe użycie, które przychodzi na myśl - Klasy usług w warstwie usług . Wyobraź sobie OrderService. Innym dużym zastosowaniem tych usług jest udostępnianie usług internetowych. Ponownie, jest to warstwa usług lub całkowicie oddzielna.
  3. Singleton - to ziarna, które istnieją na aplikację i są tworzone raz i mogą być wielokrotnie używane / otwierane. Natychmiast Configurationprzychodzi na myśl komponent - w którym możesz przechowywać konfiguracje na poziomie aplikacji i uzyskiwać do nich dostęp, gdy ich potrzebujesz z dowolnego miejsca.

Teraz pozostałych możliwości lub funkcji można używać na różnych warstwach w takich sytuacjach:

  • Bezpieczeństwo - możesz sprawdzić uprawnienia z adnotacją na temat wywoływanej metody. Może się to zdarzyć w warstwie Usługi, a także w Kontrolerze, jeśli chcesz.
  • Zarządzanie transakcjami - to oczywisty kandydat w warstwie Service lub Persistence
  • Dependency Injection - znowu będzie używany wszędzie

Jednym z dużych zastosowań w dzisiejszych czasach są tak zwane mikrousługi i architektury zorientowane na usługi. Możesz spakować niektóre komponenty logiki biznesowej jako EJB i rozprowadzić je w całej organizacji, aby mogły być używane przez wielu klientów (przez klienta mam tutaj na myśli inne aplikacje zaplecza).

I tak dalej. Teraz wielką wadą jest to, że stajesz się bardzo zależny od kontenera EJB i chociaż możesz przełączać się między 2 implementacjami referencyjnymi, nie będziesz w stanie przełączyć się na coś lżejszego - na przykład Tomcat. Ale dlaczego miałbyś chcieć poświęcić wszystkie korzyści?

ACV
źródło